更新多个记录并插入(如果不存在)

时间:2017-05-29 06:58:22

标签: mongodb mongodb-query

让我说我的测试数据是

db.multiArr.insert({"ID" : "fruit1","Keys" : "apple"})
db.multiArr.insert({"ID" : "fruit2","Keys" : "carrot"})
db.multiArr.find({'ID': {$in: ['fruit1', 'fruit2']}})

如果我想更新或插入ID,我可以使用

db.multiArr.update(
    {'ID': "fruit12"},
    {
        'ID': "fruit12"
        "$push": {
            "Keys": "tomato"
        }
    },
    upsert=True
)

我想更新或插入多条记录,我知道下面的查询只插入一行

db.multiArr.update(
     {"ID": {"$in: ["fruit123", "fruit1234"]}},
     {"ID": "---", "Keys": "tomato"},
     upsert=true
)

有没有办法更新/插入多条记录? enter image description here

1 个答案:

答案 0 :(得分:0)

你对此的看法是错误的。相反,你拿“阵列”并将其转化为操作。您可以在“一个请求”中发送多个“操作”,而不是发送多个“请求”。使用.bulkWrite()

进行批量操作
var newKeys = ["fruit123", "fruit1234" ];

db.multiArr.bulkWrite(
  newkeys.map( key => {
    return {
      "updateOne": {
        "filter": { "ID": key },
        "update": { "$set": { "Keys": "tomato" } },
        "upsert": true
      }
    }
  })   
)

这里使用常规JavaScript .map()newKeys的数组内容转换为要发送到服务器的“批量写入操作”语句数组。在其他语言中,基本概念保持不变。

通过线路,服务器的发送和响应在“一个请求”中完成,而发送执行的“包”包含多个动作。

如果需要,所有API中此方法的返回值为BulkWriteResult,其中包含匹配文档,更新和upsert的详细信息。