首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用mongodb聚合合并到嵌套对象中

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

Stack Overflow用户
提问于 2021-10-16 11:56:34
回答 2查看 1.9K关注 0票数 1

我有一个MongoDB集合,其文档结构类似于:

代码语言:javascript
复制
{
    "_id" : "xxx",
    "inner : {
        "foo" : 1,
        "bar" : 2
    }
}

数据库版本为4.2.6

还有一个聚合管道,其倒数第二个阶段是$project,其结果文档与以下类似的内容相匹配:

代码语言:javascript
复制
{
    "_id" : "xxx",
    "inner : {
        "baz" : 3
    }
}

然后是合并到集合中的最后阶段:

代码语言:javascript
复制
{
    "$merge" : {
        into: "myCollection",
        on: "_id",
        whenMatched: "merge",
        whenNotMatched: "discard"
    }
}

但是,结果是,现有的inner文档字段将被$merge结果覆盖。意思:

预期成果:

代码语言:javascript
复制
{
    "_id" : "xxx",
    "inner : {
        "foo" : 1,
        "bar" : 2,
        "baz" : 3
    }
}

实际结果:

代码语言:javascript
复制
{
    "_id" : "xxx",
    "inner : {
        "baz" : 3
    }
}

我怎样才能克服这一切?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-16 12:35:51

"merge“选项合并根文档,因此在查询中替换inner字段。

尝试用使用管道的合并替换合并。

我还没有测试过它,但我想它会没事的。

$$new变量是mongo定义的,用于引用来自管道的文档。

代码语言:javascript
复制
{
    "$merge" : {
        into: "myCollection",
        on: "_id",
        whenMatched: 
          [{"$project": 
             {"_id": "$_id",
              "inner": {"$mergeObjects": ["$inner","$$new.inner"]}}}],
        whenNotMatched: "discard"
    }
}
票数 2
EN

Stack Overflow用户

发布于 2021-10-16 19:59:53

接受的答案是一个很好的线索,尽管$project管道导致了除_idinner之外的所有字段都被覆盖。这当然不是我想要的。

最明显的选择应该是简单地使用$addFields

代码语言:javascript
复制
 whenMatched:  [
     {"$addFields" :
         {"inner.baz": "$$new.baz"}
     }
 ]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69595357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档