我在mongo中有数据:
{
items:
{
cheese: { version: 3 },
egg: { version: 23 }
}
}
我的服务收到消息,告知其最新版本的项目。 如果最新的奶酪是版本 4,我希望消息处理程序将奶酪版本更新为 4。
$set: { "items.cheese.version", 4 }
但是,有时我会收到我不感兴趣的项目的版本号。如果我收到
sausages
的版本,我不想写它,因为它不存在。
我尝试编写一个条件来检查它,并且仅在存在时更新它,但 mongo 想要 else 分支的值。我试过了
$$REMOVE
...
$set: {
"items.sausages.version": {
$cond: {
if: { $ne: ["$items.sausages", null] },
then: "7",
else: "$$REMOVE"
}
}
...但它似乎仍然在添加并且数据最终为:
{
items:
{
cheese: { version: 3 },
egg: { version: 23 },
sausages: {}
}
}
如何仅更新已存在的项目?
处理您的情况的规范方法之一是使用
$ifNull
来捕获字段不存在或等于 null 的 2 种情况。然后,将 $cond
与 $mergeObjects
链接起来,在 items
级别执行条件更新。
db.collection.updateMany({
// your query here
},
[
{
"$set": {
"items": {
"$cond": {
"if": {
"$eq": [
{
"$ifNull": [
"$items.sausages",
null
]
},
null
]
},
"then": "$items",
"else": {
"$mergeObjects": [
"$items",
{
"sausages": {
"version": 4
}
}
]
}
}
}
}
}
])