繁体   English   中英

使用 mongodb 聚合合并到嵌套对象中

[英]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管道导致除_idinner之外的每个字段都被覆盖。 这当然不是我想要的。

应该是显而易见的选择,只是使用$addFields代替:

 whenMatched:  [
     {"$addFields" :
         {"inner.baz": "$$new.baz"}
     }
 ]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM