小编典典

如何部分更新 MongoDB 中的对象,以便新对象与现有对象重叠/合并

all

鉴于此文档保存在 MongoDB

{
   _id : ...,
   some_key: { 
        param1 : "val1",
        param2 : "val2",
        param3 : "val3"
   }
}

需要保存具有来自外部世界的新信息的param2对象param3

var new_info = {
    param2 : "val2_new",
    param3 : "val3_new"
};

我想在对象的现有状态上合并/覆盖新字段,这样 param1 就不会被删除

这样做

db.collection.update(  { _id:...} , { $set: { some_key : new_info  } }

将导致 MongoDB 完全按照要求执行,并将 some_key 设置为该值。更换旧的。

{
   _id : ...,
   some_key: { 
      param2 : "val2_new",
      param3 : "val3_new"
   }
}

让 MongoDB 只更新新字段的方法是什么(没有明确地一一说明)?得到这个:

{
   _id : ...,
   some_key: { 
        param1 : "val1",
        param2 : "val2_new",
        param3 : "val3_new"
   }
}

我正在使用 Java 客户端,但任何示例都将不胜感激


阅读 112

收藏
2022-05-25

共1个答案

小编典典

如果我正确理解了这个问题,您想用另一个文档的内容更新一个文档,但只更新尚未存在的字段,并完全忽略已经设置的字段(即使是另一个值)。

没有办法在单个命令中做到这一点。

您必须首先查询文档,找出您想要的内容$set,然后更新它(使用旧值作为匹配过滤器,以确保您不会在两者之间获得并发更新)。


您的问题的另一种解读是您对 感到满意$set,但不想明确设置所有字段。那么你将如何传递数据呢?

您知道您可以执行以下操作:

db.collection.update(  { _id:...} , { $set: someObjectWithNewData }
2022-05-25