[英]Merge into a nested object using mongodb aggregation
我有一个 MongoDB 集合,其文档结构类似于:
{
"_id" : "xxx",
"inner : {
"foo" : 1,
"bar" : 2
}
}
数据库版本为4.2.6
以及一个聚合管道,其倒数第二个阶段是$project
,其结果文档与以下内容匹配:
{
"_id" : "xxx",
"inner : {
"baz" : 3
}
}
接下来是合并到集合中的最后阶段:
{
"$merge" : {
into: "myCollection",
on: "_id",
whenMatched: "merge",
whenNotMatched: "discard"
}
}
然而,结果是,现有的inner
文档字段被$merge
结果覆盖。 意义:
预期成绩:
{
"_id" : "xxx",
"inner : {
"foo" : 1,
"bar" : 2,
"baz" : 3
}
}
实际结果:
{
"_id" : "xxx",
"inner : {
"baz" : 3
}
}
我怎样才能克服这个问题?
“合并”选项合并根文档,因此在您的查询中替换inner
字段。
尝试用这个使用管道的合并替换合并。
我还没有测试过,但我认为它会没事的。
$$new
变量是 mongo 定义的,用于引用来自管道的文档。
{
"$merge" : {
into: "myCollection",
on: "_id",
whenMatched:
[{"$project":
{"_id": "$_id",
"inner": {"$mergeObjects": ["$inner","$$new.inner"]}}}],
whenNotMatched: "discard"
}
}
接受的答案是一个很好的线索,尽管$project
管道导致除_id
和inner
之外的每个字段都被覆盖。 这当然不是我想要的。
应该是显而易见的选择,只是使用$addFields
代替:
whenMatched: [
{"$addFields" :
{"inner.baz": "$$new.baz"}
}
]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.