繁体   English   中英

更新多条记录,如果不存在则插入

[英]update multi records and insert if not present

可以说我的测试数据是

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
)

我想更新或插入多条记录,我知道以下查询仅插入1行

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

有没有一种方法可以更新/插入多个记录? 在此处输入图片说明

您对此的思考是错误的方法。 相反,您采用“数组”并将其转化为运算。 而不是发送多个“请求”,而是在“一个请求”中发送多个“操作”。 使用.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 ,其中包含匹配文档,更新和适当更新的详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM