MongoDB聚合查询:移除itemId唯一的文档
在MongoDB聚合中筛选保留itemId重复的文档
要实现移除itemId唯一的文档、只保留itemId重复的记录,你可以在原聚合查询基础上添加几个阶段,通过分组统计+过滤+展开的方式完成,具体方案如下:
完整聚合查询
db.contents.aggregate([ // 原有的筛选条件,保持不变 { $match: { $or: [ { $and: [ { widgetId: new ObjectId("648d461dae1b9fb2af57fbb2") }, { value: 'Yes' } ] }, { $and: [ { widgetId: new ObjectId("648d4111ae1b9fb2af57f8f9") }, { value: "20" } ] } ] } }, // 按itemId分组,统计每个itemId的文档数量,同时保存组内所有原始文档 { $group: { _id: "$itemId", count: { $sum: 1 }, docs: { $push: "$$ROOT" } } }, // 只保留文档数大于1的分组(即itemId重复的记录) { $match: { count: { $gt: 1 } } }, // 把组内的文档数组拆分成单个文档 { $unwind: "$docs" }, // 将拆分后的文档恢复为根文档结构,和原查询输出格式一致 { $replaceRoot: { newRoot: "$docs" } } ])
各阶段作用说明
- $group:以
itemId为分组键,用$sum统计每个分组的文档数量,$push把分组内的原始文档存入数组docs中。 - $match:过滤掉统计数量为1的分组,只保留
itemId重复的分组。 - $unwind:将分组内的
docs数组拆分成独立的文档,还原成接近原始数据的结构。 - $replaceRoot:把
docs中的内容提升为根文档,让最终输出的文档结构和原查询结果完全一致。
执行该查询后,就能得到你期望的仅包含itemId重复的文档集合。
内容的提问来源于stack exchange,提问作者user3384985
相关产品推荐
相关产品推荐

