You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 02:24:20