更新大集合

时间:2016-03-20 21:18:17

标签: mongodb mongoose mongodb-query

是否有人建议如何更新大型集合中每个文档中的字段?

我使用这样的东西:

MyModel.find().exec(function(err,data){
   if(err){
      return console.log(err);
   }
   data.forEach(function(doc){
      doc.Field = doc.Field + 1;
      doc.save(function (err) {
        if(err) {
        console.error('ERROR!');
        }
      });
   });
});

但我得FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory

有没有办法以块或类似的方式处理上述更新?

2 个答案:

答案 0 :(得分:3)

您可以使用async库的async.eachLimit方法来限制并发save操作的数量(文档链接到each,向下滚动查看{ {1}}变体)。

例如,要一次将保存限制为不超过5个:

eachLimit

但是,在这种情况下,使用带有MyModel.find().exec(function(err, data){ if (err) { return console.log(err); } async.eachLimit(data, 5, function(doc, callback){ doc.Field = doc.Field + 1; doc.save(function(err) { if (err) { console.error('ERROR!'); } callback(err); }); }); }); 运算符的单update$inc选项来增加每个文档的multi: true值会更高效1。

Field

答案 1 :(得分:1)

你需要更多内存: - max_new_space_size和/或--max_old_space_size,如下所示:

node --max-old-space-size=4096 server.js 
  

目前,默认情况下,v8在32位上的内存限制为512MB   系统,64位系统上的1.4GB。限制可以提高   将--max_old_space_size设置为最大值~1024(~1 GB)(32位)   和~4096(~4GB)(64位),但建议你拆分你的   如果你达到内存限制,单个进程会分成几个工作者