我需要在mongodb中插入一些矩阵,所以我编写了简单的代码
var MongoClient = require('mongodb').MongoClient;
var matrisMaker = function(d1,d2){
var result = new Array();
for (var i = 0;i < d1;i++){
result.push(new Array());
for (var k = 0;k < d2;k++){
result[i].push(Math.round(Math.random() * 1000000000000));
}
}
return result;
};
MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err, db) {
if(err) throw err;
var collection = db.collection('matris');
for (var counter = 0;counter < 10000000;counter++){
var insertObject = {
'matrisA':matrisMaker(20,20),
'matrisB':matrisMaker(20,20),
'resultA':new Object(),
'resultB':new Object()
};
collection.insert(insertObject, function(err, docs) {
if (err)
throw err;
});
delete insertObject;
if ((counter % 1000) == 0)
console.log(counter);
}
db.close();
})
当我看到日志打印时插入了太多的记录,比如50,000,但是当我使用mongodb来计算记录数量时,它会显示更少,接近1,000条记录。
>use test;
>db.matris.count();
问题出在哪里?
答案 0 :(得分:3)
您的异步代码存在缺陷,并且在异步db.close()
命令全部完成之前执行了insert
行。您需要控制程序的流程A)没有百万个并发数据库插入发生/排队和B)等待它们在关闭连接之前全部由mongo处理。如果您不想自己编写代码,请考虑使用async.forEach
等帮助程序库来帮助解决此问题。