egu*_*eys 2 javascript mongoose mongodb node.js mongodb-query
我想使用如下JavaScript将100万条记录保存到mongodb:
for (var i = 0; i<10000000; i++) {
model = buildModel(i);
db.save(model, function(err, done) {
console.log('cool');
});
}
Run Code Online (Sandbox Code Playgroud)
我尝试过,它保存了约160条记录,然后挂2分钟,然后退出。为什么?
它之所以崩溃,是因为您不等待异步调用完成就可以继续进行下一个迭代。这意味着您正在构建未解决的操作的“堆栈”,直到这引起问题。这个网站的名称又是什么?拿图片吗
因此,这不是进行“批量”插入的最佳方法。幸运的是,除了前面提到的回调问题之外,底层的MongoDB驱动程序已经考虑了这一点。实际上,有一个“批量API”可以使整个过程变得更好。并假设您已经将本机驱动程序作为db
对象。但是我更喜欢仅使用.collection
模型中的访问器和“异步”模块来使一切变得清晰:
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" ;
}
);
Run Code Online (Sandbox Code Playgroud)
两者的区别是在完成时使用“异步”回调方法,而不是仅建立堆栈,还使用“批量操作API”,以便通过在1000个条目的批处理更新语句中提交所有内容来减轻异步写调用。
这不仅不仅像您自己的示例代码一样“堆积”了函数执行的堆栈,而且还通过不将所有内容都发送到单个语句中而执行了有效的“有线”事务,而是分成了可管理的“批次”以进行服务器承诺。
归档时间: |
|
查看次数: |
1278 次 |
最近记录: |