我正在考虑是否有更好的方法来执行此类特定类型的批量更新。
如果我有_id
和values
的列表或地图,请执行以下操作:
var updates = [
{_id: "abc", field: 12},
{_id: "abd", field: 32},
{_id: "xyz", field: 22},
// ... snip (100 or more records) ...
}
我想在列出的每个文档中使用myCollection
的新值更新field
,例如:
var update;
for (var i = 0; i < updates.length; i++){
update = updates[i];
db.myCollection.update({_id: update._id}, {$set: {field: update.field}});
}
但这似乎过时了,因为它必须逐个往返服务器每个查询。
在SQL中,我会通过执行单个查询(或使用临时表)避免额外的往返:
WITH batch_update (_id uuid, value int) as (
VALUES (...)
);
UPDATE my_table
SET
value = bu.value
FROM
batch_update as bu
WHERE
bu._id = my_table._id;
因此。有没有更好的方法来实现这个结果?
答案 0 :(得分:2)
您可以使用Bulk API来实现此目标。
var updates = [{"_id": "abc", "field": 12},
{"_id": "abd", "field": 32},
{"_id": "xyz", "field": 22}];
var bulk = db.myCollection.initializeUnorderedBulkOp();
var update = undefined;
for (var i = 0; i < updates.length; i++){
update = updates[i];
bulk.find( {_id: update._id} ).update( {$set: {field: update.field}} );
}
bulk.execute();
此外,您可以添加逻辑,每100条记录左右调用一次bulk.execute()
。