首页 > 解决方案 > 仅当该属性存在时,如何在 mongo 中更新嵌套对象?

问题描述

有一个像这样的集合:

{
_id: 1,
obj: {val1: 1, val3: 3}
},
{
_id: 2,
obj: {val2: 2, val3: 3}
}

我可以在查询中只更新 obj 中的现有值吗?

col.updateMany({ _id: { $in: [1, 2] } }, { $set: { val1: 12, val2: 22, val3: 32 } })

但我希望结果是

{
_id: 1
obj: {val1: 12, val3: 32 }
},
{
_id: 2
obj: {val2: 22, val3: 32}
}

我想我正在寻找 $setIfExists 选项。

谢谢

标签: mongodb

解决方案


询问

  • 您可以使用管道更新进行条件更新,需要 MongoDB >=4.2
  • 而不是12,22,32val1,val2,val3
  • 它首先检查该值是否存在,如果存在则用新值更新它,否则$REMOVE(这意味着添加+删除=不添加任何内容)

测试代码在这里

update(
{"_id": {"$in": [1,2]}},
[{"$set": 
  {"obj.val1": 
   {"$cond": 
    [{"$ne": [{"$type": "$obj.val1"}, "missing"]}, 12, "$$REMOVE"]},
   "obj.val2": 
    {"$cond": 
     [{"$ne": [{"$type": "$obj.val2"}, "missing"]}, 22, "$$REMOVE"]},
    "obj.val3": 
     {"$cond": 
      [{"$ne": [{"$type": "$obj.val3"}, "missing"]}, 32, "$$REMOVE"]}}}],
{"multi": true})

推荐阅读