mongodb – 更新存在的数组或插入新的数组项

{
 _id:'1',
name:'apple',
option:[{
weight:'10',
price:'40',
},
{weight:'40',
price:'200'}]
}

我想添加苹果,如果它不在数据库,如果它在数据库中,我想ckeck如果重量10可用,如果可用我想更新价格,如果不是我想在选项中添加新的重量和价格.我怎么能这样做,在mongodb.

最佳答案 你想要
.bulkWrite().这实际上不是单个操作,因此您希望在单个请求中提交多个操作.基本上尝试用数据存在的
$set编写更新,或者在不存在数据的情况下编写新数据
$push

db.collection.bulkWrite([
  { "updateOne": {
    "filter": { "_id": "1", "option.weight": "10" },
    "update": { 
      "$set": { "option.$.price": "30" }
    }
  }},
  { "updateOne": {
    "filter": { "_id": "1", "option.weight": { "$ne": "10" } },
    "update": {
      "$push": { "option": { "weight": "10", "price": "30" } }
    }
  }}
])

正面的情况只是值,而$ne“否定”相等匹配,意味着该项目不存在.当然positional $ operator$set一起使用

在给定数据的情况下,尽管在“批次”中发送了两个操作,但是其中一个操作实际上将匹配并应用为更新.

如果你想要整个文档的“upserts”,那么你需要在其末尾添加另一个操作.请注意,您不能将“upsert”作为选项应用于任何其他语句,尤其是$ne,因为这会创建一个新文档,其中数组项不存在,而不仅仅是_id:

db.collection.bulkWrite([
  { "updateOne": {
    "filter": { "_id": "1", "option.weight": "10" },
    "update": { 
      "$set": { "option.$.price": "30" }
    }
  }},
  { "updateOne": {
    "filter": { "_id": "1", "option.weight": { "$ne": "10" } },
    "update": {
      "$push": { "option": { "weight": "10", "price": "30" } }
    }
  }},
  { "updateOne": {
    "filter": { "_id": 1 },
    "update": {
      "$setOnInsert": {
        "option": [
           { "weight": "10", "price": "30" }
         ]
      }
    },
    "upsert": true
  }}
])

$setOnInsert是主要的帮助,除了最后一个操作是唯一标记为“upsert”.该组合确保找到主要“文档”的位置,然后实际上没有发生任何事情,但是当找不到时,会添加新的数组项.

作为旁注,我强烈建议将数值实际存储为数字而不是字符串.在大多数情况下,它不仅可以节省空间,而且在这方面也更有用.

点赞