mongodb - 在元素不存在的地方插入数组,否则更新它(有多个条件)

标签 mongodb mongodb-query

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

如果重量或大小不同,我想在数组中插入新对象,如果大小和重量都匹配,我想更新它。我该怎么做?

最佳答案

类似于your previous question , 你使用 .bulkWrite()但由于数组元素选择具有“多个条件”,因此您可以在此处使用 $elemMatch :

db.collection.bulkWrite([
  { "updateOne": {
    "filter": { 
      "_id": "1", 
      "option": { 
        "$elemMatch": { "weight": "40", "size": "40" }
      }
    },
    "update": { 
      "$set": { "option.$.price": "300" }
    }
  }},
  { "updateOne": {
    "filter": {
      "_id": "1",
      "option": {
        "$not": {
          "$elemMatch": { "weight": "40", "size": "40" }
        }
      }
    },
    "update": {
      "$push": { "option": { "weight": "40", "size": "40",  "price": "300" } }
    }
  }},
  { "updateOne": {
    "filter": { "_id": 1 },
    "update": {
      "$setOnInsert": {
        "option": [
           { "weight": "40", "size": "40",  "price": "300" }
         ]
      }
    },
    "upsert": true
  }}
])

所以操作是:

  1. 测试$elemMatch中的数组元素匹配条件存在然后$set匹配值。

  2. 测试数组元素为$not存在于否定中。您也可以使用 $ne在每个属性上,但否定两个匹配的条件更清晰。

     "$elemMatch": { "weight": { "$ne": "40" }, "size": { "$ne": "40" } }
    

    好歹你$push找到一个符合提供条件的新数组元素。

  3. 仅在未找到主文档 _id 的情况下尝试“更新插入”,并使用 $setOnInsert因此,如果找到文档,此操作将不执行任何操作。

和以前一样,尽管整个批处理都被发送到服务器,但其中只有一个会实际写入任何内容。

关于mongodb - 在元素不存在的地方插入数组,否则更新它(有多个条件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46806613/

相关文章:

mongodb - 覆盖 Labix mgo 中的默认 writeConcern

python - 使用 Python 插入到具有唯一键的 MongoDB 集合

MongoDB 和大数字文档 ID

python - 如何使用 pymongo 在我的 GridFS 上存储自定义元数据?

mongodb - 外部数据库服务(mongohq等)的优缺点

arrays - 如何在 mongodb 中更新多个数组元素

node.js - 使用 MongoDB 进行数据分区

node.js - MongoDB-查询优化

ruby-on-rails - 如何在 rails 4.2.4 中使用正确版本的 mongo、mongoid、bson、bson_ext?

javascript - 如何仅在 mongoDB 和 meteor 中获取不同的值?