MongoDB聚合框架如何合并数组中gugun字段值相同的对象
MongoDB聚合合并guguns数组同gugun字段对象方案
你可以通过$unwind+$group+数组重构的聚合管道实现需求,具体步骤如下:
完整聚合管道
[ // 展开guguns数组为单条文档 { "$unwind": "$guguns" }, // 按原始文档ID+gugun名称分组,合并同gugun的属性 { "$group": { "_id": { "root_id": "$_id", "gugun": "$guguns.gugun" }, // 保留原始文档所有顶级字段 "root": { "$first": "$$ROOT" }, // 合并同gugun下的所有字段,同名字段默认后出现的覆盖先出现的 "merged_gugun_item": { "$mergeObjects": "$guguns" } } }, // 按原始文档ID重新分组,重构guguns数组 { "$group": { "_id": "$_id.root_id", "root": { "$first": "$root" }, "guguns": { "$push": "$merged_gugun_item" } } }, // 还原文档结构,替换合并后的guguns数组 { "$replaceRoot": { "newRoot": { "$mergeObjects": [ "$root", { "guguns": "$guguns" } ] } } } ]
逻辑说明
$unwind阶段将数组拆分为独立条目,方便后续分组处理- 第一次
$group的分组键同时包含原始文档_id和gugun字段,确保只会合并同一个原始文档下相同gugun的条目,不会跨文档合并 $mergeObjects会自动合并同gugun下所有存在的字段,符合你当前互补字段的合并需求;如果同gugun下存在同名字段需要累加求和,可将对应字段改为$sum算子统计,例如:"first_count": { "$sum": "$guguns.first_count" }- 最后通过
$replaceRoot还原原始文档结构,自动保留所有顶级字段,无需手动逐个声明。
内容的提问来源于stack exchange,提问作者extradeck
相关产品推荐
相关产品推荐

