假设我有一个文档结构集合。
{
uuid: "157071f4-2624-4c49-8735-bd345425a16b",
price: {
item1: 20,
item2: 30
}
}
现在我想基于uid来替换数据,使用类似
的东西await Coll.findOneAndUpdate({uuid}, {$set: {[`price.${itemNo}`]: 40}, {upsert: true}}
我的问题是$set在这里更新值,即使itemNo已经存在的情况下。如果我在query上加上一个check,比如
{uuid, [`price.${itemNo}`]: {$exists: 0}}
则由于upsert,即使uuid存在,它也会创建一个新文档。
我的最终目标是实现upsert,如果uuid不存在,并且如果uuid存在,则不更新"price.item"的值如果它也存在,则设置该值。像$setOnInsert
这样的东西也不符合要求,我只需要更新值。提前谢谢。
找到解决方案了。我们可以通过首先定义更新字段来实现这一点:
let fieldName = `price.${itemNo}`
然后像这样做:
await Coll.findOneAndUpdate({
uuid
},
[{
$set: {
[fieldName]: {
$cond: [{
$or: [
{$ne: ["$price", null]},
{$ne: [`$${fieldName}`, null]}
]
}, valueToBeSet, `$${fieldName}`]
}
}
}], {upsert: true}