mongodb - 仅当该属性存在时,如何在 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 >=4.2
- 而不是
12,22,32
为val1,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})
推荐阅读
- android - 尝试为 android arm64 交叉编译 libnl 时出错
- java - Mockito.verify 的 AssertJ 解决方案
- c# - 是否可以在单个 ServiceHost 中拥有多种服务类型和服务端点?
- npm - 如何从不同的 `/node_modules/` 文件夹导入模块
- c# - Xamarin.iOS 中的网络类型
- python - 如何在 Keras 中训练(拟合)连接模型?
- javascript - 在 Javascript/Jquery 中按住一个按键(Shift 键)
- javascript - 多个状态,相同的动作创建者
- javascript - 当我单击“添加到图表”并且通知是成功或失败时,我想使用 ajax laravel 发出通知
- amazon-web-services - 即使使用 SSL 证书,带有 WWW 的子域也不安全