从键值对列表中更新一组文档

时间:2015-01-07 04:07:47

标签: mongodb

我正在考虑是否有更好的方法来执行此类特定类型的批量更新。

如果我有_idvalues的列表或地图,请执行以下操作:

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;

因此。有没有更好的方法来实现这个结果?

1 个答案:

答案 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()