如果不为空 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}