如何查询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))
逻辑说明
$addToSet会把items数组中的所有item_id提取出来,自动去重生成新数组;$size用来获取数组的长度,分别得到去重后的数量和原数组的数量;$match阶段通过$expr对比两个长度,不相等就说明数组里存在重复的item_id。
内容的提问来源于stack exchange,提问作者James Wierzba
相关产品推荐
相关产品推荐

