更新多条记录,如果不存在插入
问题描述:
比方说我的测试数据是更新多条记录,如果不存在插入
db.multiArr.insert({"ID" : "fruit1","Keys" : "apple"})
db.multiArr.insert({"ID" : "fruit2","Keys" : "carrot"})
db.multiArr.find({'ID': {$in: ['fruit1', 'fruit2']}})
,如果我想更新或使用
db.multiArr.update(
{'ID': "fruit12"},
{
'ID': "fruit12"
"$push": {
"Keys": "tomato"
}
},
upsert=True
)
我想更新插入一个ID,我可以做到这一点或插入多个记录,我知道下面的查询插入只有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
,其中包含适当的匹配文档,更新和upserts的详细信息。
你问你是否以这个数组开头'[“fruit123”,“fruit1234”]'那么如何用''tomato'插入/插入多个文档'总是作为'Keys'的值?你意识到你基本上用''ID“:”---“''''来避免'$ in'和upsert出现在第一位的错误,这是不是你?我不确定我看到“实用”实用程序。 –
事情是我想更新集合中的现有记录,如果ID存在或者插入记录与新的ID,而不是循环每个ID –
所以你的意图是“创建”与提供的“ID”来自阵列的值。是?注意自“'ID”:“---”',并且整个更新文档以覆盖提供的值的方式指定。我们理解upsert部分,这只是你打算采取的其他行动并不清楚。 –