MongoDB聚合查询如何将$group生成的_id内字段提取到对象顶层
解决方案
你可以通过以下两种无需手动罗列_id内字段的方案实现需求,适配任意数量的分组字段,后续调整分组规则时也不需要修改后续聚合阶段的代码:
方案1:使用$replaceRoot + $mergeObjects(推荐,MongoDB 3.4及以上版本支持)
这是最简洁的实现方式,直接将_id对象的所有属性展开到顶层,同时保留分组生成的其他字段:
db.collection.aggregate([ { "$group": { _id: { "country": "$country", "colour": "$colour" }, "names": { "$push": "$name" } // 无需重复声明_id内的任何字段 } }, { "$replaceRoot": { "newRoot": { "$mergeObjects": [ "$_id", // 自动展开_id下的所有字段 { "names": "$names" } // 保留分组生成的自定义字段 ] } } } ])
方案2:使用$set + $project(兼容低版本MongoDB)
如果你的MongoDB版本低于3.4不支持$replaceRoot,可以使用该方案:
db.collection.aggregate([ { "$group": { _id: { "country": "$country", "colour": "$colour" }, "names": { "$push": "$name" } } }, { "$set": { "$mergeObjects": ["$_id", "$$CURRENT"] } }, { "$project": { "_id": 0 // 仅需删除_id字段即可 } } ])
内容的提问来源于stack exchange,提问作者Geraint Anderson
相关产品推荐
相关产品推荐

