使用PyMongo查询MongoDB多字段去重后的字典列表结果
问题原因
你当前使用的distinct()方法仅支持对单个字段做去重,返回结果是该字段的去重值列表,无法同时返回多个字段的组合去重结果,因此现有代码只会输出去重后的base-url值,带不上对应的name字段。
实现方案
推荐使用MongoDB聚合管道实现多字段组合去重,性能远高于查询全量数据后在Python端去重,适合所有数据量场景。
具体代码
# 定义聚合管道 pipeline = [ # 按name + base-url的字段组合分组,自动完成组合去重 { "$group": { "_id": { "name": "$name", "base-url": "$base-url" } } }, # 调整输出格式,去掉默认的_id字段,整理为目标结构 { "$project": { "name": "$_id.name", "base-url": "$_id.base-url", "_id": 0 } } ] # 执行聚合查询 data = list(crawlcol.aggregate(pipeline))
执行后返回的data就是你期望的格式:
[ {"name":"axe1","base-url":"www.example1.com"}, {"name":"axe2","base-url":"www.example2.com"}, {"name":"axe3","base-url":"www.example3.com"} ]
注意:该逻辑严格按照
name和base-url两个字段的组合做去重,如果后续业务中出现同一个base-url对应多个不同name的情况,代码会将所有不重复的组合全部返回,符合多字段去重的逻辑。
可选轻量方案(仅适合极小数据量)
如果集合数据量非常小,也可以先查询所有目标字段,再在Python端做去重:
filter_stuff = {'base-url': 1, 'name':1,'_id': 0} all_docs = list(crawlcol.find({}, filter_stuff)) # 利用字典实现组合去重 unique_map = {} for doc in all_docs: key = (doc['name'], doc['base-url']) if key not in unique_map: unique_map[key] = doc data = list(unique_map.values())
该方案会把全量符合条件的文档都加载到内存,数据量大时会有明显性能问题,优先选择聚合管道方案。
内容的提问来源于stack exchange,提问作者imhans4305
相关产品推荐
相关产品推荐

