如果不为空 mongodb 则用 $set 更新
upsert with $set if not null mongodb
假设我有一个文档结构集合。
{
uuid: "157071f4-2624-4c49-8735-bd345425a16b",
price: {
item1: 20,
item2: 30
}
}
现在我想根据 uuid 插入数据,使用类似
的东西
await Coll.findOneAndUpdate({uuid}, {$set: {[`price.${itemNo}`]: 40}, {upsert: true}}
我的问题是 $set 在这里更新值,即使在 itemNo 已经存在的情况下也是如此。如果我检查查询,比如
{uuid, [`price.${itemNo}`]: {$exists: 0}}
然后即使 uuid 存在,它也会由于更新插入而创建一个新文档。
我的最终目标是在 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}
假设我有一个文档结构集合。
{
uuid: "157071f4-2624-4c49-8735-bd345425a16b",
price: {
item1: 20,
item2: 30
}
}
现在我想根据 uuid 插入数据,使用类似
的东西await Coll.findOneAndUpdate({uuid}, {$set: {[`price.${itemNo}`]: 40}, {upsert: true}}
我的问题是 $set 在这里更新值,即使在 itemNo 已经存在的情况下也是如此。如果我检查查询,比如
{uuid, [`price.${itemNo}`]: {$exists: 0}}
然后即使 uuid 存在,它也会由于更新插入而创建一个新文档。
我的最终目标是在 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}