You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 02:25:27