首页 > 解决方案 > Mongodb合并更新子文档中的嵌套字段

问题描述

我正在搜索它是否存在,在 mongodb 或其 nodejs 驱动程序中,任何合并/更新子文档的方法,如下所示:

{
    subdocument: {
        a: 1,
        b: 2
    }
}
db.C.updateOne(
    {},
    {
        $set: {
            "subdocument.b": 3
        }
    }
}
db.C.updateOne(
    {},
    {
        $set: {
            subdocument: {
                b: 3
            }
        }
    }
}
{
    subdocument: {
        b: 3
    }
}
{
    subdocument: {
        a: 1,
        b: 3
    }
}

为了记录,我想要这样做的原因是因为我试图使用接口来尽可能避免在字符串中编写模式关键字,所以我可以让打字稿编译器尽可能多地检查它们。所以我知道这样做的方法是更新“subdocument.b”,但我完全不想这样做,以避免使用字符串。

显然,子文档没有合并,而是使用标准更新无选项完全替换。我想知道是否有一种方法可以使用 mongodb 查询语言、聚合框架、mongodb nodejs 驱动程序或其他方式来本地执行此操作?从我自己可以学到的东西来看,它似乎不受支持,但也许是这样,有人可以告诉我怎么做吗?

谢谢

标签: node.jsmongodb

解决方案


如果您使用管道更新 MongoDB >= 4.2,这很容易做到。使用管道更新,所有聚合运算符都可以使用,但只有有限的阶段可以看到数据库命令,驱动程序在内部使用它。

如果您使用管道更新,则只能使用聚合运算符或查询运算符,$match前提是您使用$expr. 旧的更新运算符在管道内不起作用。

测试代码在这里

db.collection.update({},
[
  {
    "$addFields": {
      "subdocument": {
        "$mergeObjects": [
          "$subdocument",
          {
            "b": 3
          }
        ]
      }
    }
  }
])

推荐阅读