upsert与$set如果不是null mongodb



假设我有一个文档结构集合。

{
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}

最新更新