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

如何查询MongoDB中子文档数组含重复字段的文档?

查询MongoDB中数组含重复项的文档

现有文档结构

{
    "doc1": {
        "items": [
            {
                "item_id": 1
            },
            {
                "item_id": 2
            },
            {
                "item_id": 3
            }
        ]
    },
    "doc2": {
        "items": [
            {
                "item_id": 1
            },
            {
                "item_id": 2
            },
            {
                "item_id": 1
            }
        ]
    }
}

需求说明

需要找出items数组中存在item_id重复值的文档,示例中仅doc2符合条件(包含两个item_id=1的项)。

用户的错误尝试

你之前写的查询逻辑没法实现需求,因为MongoDB没有内置的unique_count字段,且$size无法直接和动态计算的去重长度对比:

qry = {
    "items": {
        "$size": {
            "$ne": {
                "items.unique_count" # 这个字段不存在,没法这么用
            }
        }
    }
}
result = MyDocument.find(qry)

正确查询方案

要实现这个需求,得用聚合查询来动态计算数组原长度和去重后的长度,再做对比:

from pymongo import MongoClient

# 连接数据库(按需修改连接信息)
client = MongoClient()
db = client.your_database_name
collection = db.your_collection_name

# 定义聚合管道
pipeline = [
    # 新增两个临时字段:去重后的item_id数量、原数组的item数量
    {
        "$addFields": {
            "unique_item_count": {
                "$size": {
                    "$addToSet": "$items.item_id" # 提取item_id并去重
                }
            },
            "original_item_count": {
                "$size": "$items" # 原数组长度
            }
        }
    },
    # 筛选原长度和去重长度不相等的文档(说明有重复项)
    {
        "$match": {
            "$expr": {
                "$ne": ["$original_item_count", "$unique_item_count"]
            }
        }
    },
    # 可选:移除临时添加的字段,只保留原文档内容
    {
        "$project": {
            "unique_item_count": 0,
            "original_item_count": 0
        }
    }
]

# 执行查询并获取结果
result = list(collection.aggregate(pipeline))

逻辑说明

  1. $addToSet会把items数组中的所有item_id提取出来,自动去重生成新数组;
  2. $size用来获取数组的长度,分别得到去重后的数量和原数组的数量;
  3. $match阶段通过$expr对比两个长度,不相等就说明数组里存在重复的item_id。

内容的提问来源于stack exchange,提问作者James Wierzba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 21:36:26