MongoDB聚合阶段中展开_id字段的问题求助
解决MongoDB聚合后展开_id嵌套字段的问题
测试数据
db.test.insertOne({A: "A1", B: "B1", num:1}) db.test.insertOne({A: "A2", B: "B2", num:2}) db.test.insertOne({A: "A1", B: "B2", num:3}) db.test.insertOne({A: "A2", B: "B1", num:4}) db.test.insertOne({A: "A1", B: "B1", num:5}) db.test.insertOne({A: "A2", B: "B2", num:6}) db.test.insertOne({A: "A1", B: "B2", num:7}) db.test.insertOne({A: "A2", B: "B1", num:8})
原聚合代码(无效尝试)
你尝试用$unwind展开_id,但$unwind仅对数组类型字段生效,所以结果无变化:
db.test.aggregate([ { $group: { _id: {A:"$A",B:"$B"}, sum: { $sum: "$num" } } }, { $unwind: "$_id" } ])
当前输出
{ _id: { A: 'A1', B: 'B2' }, sum: 10 } { _id: { A: 'A2', B: 'B2' }, sum: 8 } { _id: { A: 'A1', B: 'B1' }, sum: 6 } { _id: { A: 'A2', B: 'B1' }, sum: 12 }
期望输出
{ A: 'A1', B: 'B2', sum: 10 } { A: 'A2', B: 'B2', sum: 8 } { A: 'A1', B: 'B1', sum: 6 } { A: 'A2', B: 'B1', sum: 12 }
有效解决方案
要将_id中的嵌套字段提取到顶层,可使用以下两种方法:
方法1:$replaceRoot + $mergeObjects
合并_id内的字段与sum字段,替换为新的根文档:
db.test.aggregate([ { $group: { _id: {A:"$A",B:"$B"}, sum: { $sum: "$num" } } }, { $replaceRoot: { newRoot: { $mergeObjects: ["$_id", { sum: "$sum" }] } } } ])
方法2:$project显式映射字段
直接提取_id.A、_id.B为顶层字段,同时排除原_id:
db.test.aggregate([ { $group: { _id: {A:"$A",B:"$B"}, sum: { $sum: "$num" } } }, { $project: { _id: 0, A: "$_id.A", B: "$_id.B", sum: 1 } } ])
若需将结果写入新集合,可在聚合末尾添加$out阶段:
{ $out: "your_new_collection" }
内容的提问来源于stack exchange,提问作者Sadegh
相关产品推荐
相关产品推荐

