MongoDB聚合$merge合并嵌套对象字段被覆盖如何解决
MongoDB $merge 嵌套字段被覆盖问题解决方案
问题原因
$merge 阶段默认的 whenMatched: "merge" 仅支持顶层字段的浅合并:当待合并文档的顶层存在inner字段时,会直接覆盖原文档的整个inner嵌套文档,不会自动执行嵌套层级的字段合并,因此会丢失原有inner下的foo、bar字段。
解决方案
方案1:修改$merge阶段配置(无需调整前置聚合逻辑)
将whenMatched参数替换为聚合管道,手动实现嵌套字段的合并,适配MongoDB 4.2及以上版本:
{ "$merge": { into: "myCollection", on: "_id", whenMatched: [ { $set: { "inner": { $mergeObjects: [ "$inner", "$$new.inner" ] } } } ], whenNotMatched: "discard" } }
说明:$inner指代原集合中已存储文档的inner字段,系统变量$$new指代当前聚合管道输出的待合并新文档,$mergeObjects会将两个嵌套文档的字段合并,重复字段会取后者的值。
方案2:调整前置聚合阶段,提前构造合并后的inner字段
如果你的聚合逻辑可以直接获取到原文档的inner字段,可以在$project阶段直接完成嵌套字段合并,再用原有$merge配置执行即可:
// 调整后的$project阶段 { $project: { _id: 1, "inner": { $mergeObjects: [ "$inner", { "baz": 3 } ] } // 其他你需要输出的字段 } }
内容的提问来源于stack exchange,提问作者Ori Dar
相关产品推荐
相关产品推荐

