MongoDB聚合查询问题:查找fieldA重复项时如何高效输出fieldB字段
解决MongoDB聚合输出指定字段(fieldB)的高效方案
嘿,完全懂你的痛点——不想绕着关联原集合的弯路,直接从聚合管道里输出你要的fieldB对吧?其实不用那么麻烦,只要在$group阶段就把fieldB的数据一起收集起来,后续直接输出就行,全程在管道内完成,效率高多了。
分两种场景给你方案:
场景1:同一个fieldA对应多个不同的fieldB
如果重复的fieldA可能关联多个fieldB,你可以用$push把它们都收集成数组:
db.collection.aggregate([ // 按fieldA分组,同时收集对应的所有fieldB { "$group": { "_id": "$fieldA", "count": {"$sum": 1}, "fieldBs": {"$push": "$fieldB"} } }, // 筛选出重复项(count>1且fieldA不为空) { "$match": { "_id": {"$ne": null}, "count": {"$gt": 1} } }, // 只输出fieldB数组,去掉多余字段 { "$project": { "_id": 0, "fieldB": "$fieldBs" } } ]);
要是你想对fieldB去重,把$push换成$addToSet就行。
场景2:同一个fieldA对应唯一的fieldB
如果你的数据里,每个fieldA只会对应一个fieldB(比如fieldA是重复的标识,fieldB是关联的唯一值),那用$first或者$last直接取单个值更简洁:
db.collection.aggregate([ { "$group": { "_id": "$fieldA", "count": {"$sum": 1}, "fieldB": {"$first": "$fieldB"} // 也可以用$last,看你要取哪一个 } }, { "$match": { "_id": {"$ne": null}, "count": {"$gt": 1} } }, { "$project": { "_id": 0, "fieldB": 1 } } ]);
为什么这个方法更高效?
全程在聚合管道内完成数据处理,不需要额外的$lookup去关联原集合,避免了二次查询的IO开销,比你之前想的关联方式性能好很多。
内容的提问来源于stack exchange,提问作者kedoink
相关产品推荐
相关产品推荐

