javascript - 如何将 100 万条记录异步保存到 mongodb?

标签 javascript node.js mongodb mongoose mongodb-query

我想像这样使用 javascript 将 100 万条记录保存到 mongodb:

for (var i = 0; i<10000000; i++) {
  model = buildModel(i);
  db.save(model, function(err, done) {
    console.log('cool');
  });
}

我试过了,它保存了大约 160 条记录,然后挂起 2 分钟,然后退出。为什么?

最佳答案

它失败了,因为您没有等待异步调用完成就可以继续下一次迭代。这意味着您正在构建一个未解决操作的“堆栈”,直到这导致问题为止。这个站点的名称又是什么?拿到照片了吗?

所以这不是继续 "Bulk" 的最佳方式插入。幸运的是,除了前面提到的回调问题外,底层的 MongoDB 驱动程序已经考虑到了这一点。实际上有一个 "Bulk API"可以使这一切变得更好。并假设您已经将 native 驱动程序提取为 db 对象。但我更喜欢只使用模型中的 .collection 访问器,以及 "async"使一切清晰的模块:

var bulk = Model.collection.initializeOrderedBulkOp();
var counter = 0;

async.whilst(
  // Iterator condition
  function() { return count < 1000000 },

  // Do this in the iterator
  function(callback) {
    counter++;
    var model = buildModel(counter);
    bulk.insert(model);

    if ( counter % 1000 == 0 ) {
      bulk.execute(function(err,result) {
        bulk = Model.collection.initializeOrderedBulkOp();
        callback(err);
      });
    } else {
      callback();
    }
  },

  // When all is done
  function(err) {
    if ( counter % 1000 != 0 ) 
        bulk.execute(function(err,result) {
           console.log( "inserted some more" );
        });        
    console.log( "I'm finished now" ;
  }
);

不同之处在于在完成时使用两种“异步”回调方法而不是仅仅建立一个堆栈,而且还使用“批量操作 API”以通过提交 1000 条批量更新语句中的所有内容来减轻异步写入调用条目。

这不仅不会像您自己的示例代码那样“建立一个堆栈”的函数执行,而且还通过不在单独的语句中发送所有内容,而是分解成可管理的“批处理”来执行高效的“有线”事务服务器 promise 。

关于javascript - 如何将 100 万条记录异步保存到 mongodb?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28087624/

相关文章:

javascript - 如何在 NodeJS Express 路由器 res.render 中传递 Mongoose 返回变量?

node.js - 如何将应用程序配置为可用的子域 cookie?

python - 将项目插入 MongoDb 后,如何获取其 ObjectID?

mongodb - 创建一个新的meteor.js文件并得到错误100,MongoDB无法写入

node.js - 无法在用于从一种方法到另一种方法的服务器端代码测试的 nodeunit 测试用例中获取对象值

javascript - 我将所有内容都保存在外部 .js 文件中。但并非所有功能都在每个页面上使用。这会影响速度吗?

javascript - 替换 HTML 字符串和避免标记(正则表达式)

javascript - 通过 AJAX 将数据发布到 PHP 文件

javascript - 神经网络连续 tanh-Sigmoid 激活函数和随机权重

Node.js,基于日期时间的提醒