我想像这样使用 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/