我有一个NodeJS应用程序,应该以同步方式生成大量数据集(多个嵌套for循环)。这些数据集应该保存到我的MongoDB数据库中,以便以后更有效地查找它们。
我为NodeJS使用mongodb驱动程序并运行守护程序。与DB的连接工作正常,根据守护程序窗口,第一组数据集正在成功存储。每隔约400-600ms就有另一个存储组,但在第一个数据集之后,MongoDB控制台中不再有输出(甚至不是错误),并且由于文件大小没有增加,我认为这些写操作不起作用(我无法等待它完成,因为它需要多天才能完全运行)。
如果我重新启动NodeJS脚本,它甚至不会再保存第一个键,可能是因为重复?如果我删除了db文件夹内容,第一个将再次保存。
这是我脚本的重要部分,我无法找到任何我做错的事情。我认为问题在于内部逻辑(奇怪的重复检查/不运行并发等)。
var MongoClient = require('mongodb').MongoClient, dbBuffer = [];
MongoClient.connect('mongodb://127.0.0.1/loremipsum', function(err, db) {
if(err) return console.log("Cant connect to MongoDB");
var collection = db.collection('ipsum');
console.log("Connected to DB");
for(var q=startI;q<endI;q++) {
for(var w=0;w<words.length;w++) {
dbBuffer.push({a:a, b:b});
}
if(dbBuffer.length) {
console.log("saving "+dbBuffer.length+" items");
collection.insert(dbBuffer, {w:1}, function(err, result) {
if(err) {
console.log("Error on db write", err);
db.close();
process.exit();
}
});
}
dbBuffer = [];
}
db.close();
});
更新
答案 0 :(得分:0)
我自己“解决了”它。我有一个误解是,每个插入事务都在MongoDB控制台中得到确认,而实际上只确认了第一个,或者命令之间是否有一段时间。要检查插入过程是否真的有效,需要运行脚本一段时间并等待MongoDB将其转储到本地文件中(大约30-60秒)。
此外,插入过程相继太快,并且MongoDB似乎在Win10 x64下无法正确处理。我从Array-Buffer更改为内部缓冲区(请参阅注释),并且仅在插入先前数据后继续执行该过程。
这是简化的结果代码
db.collection('seedlist', function(err, collection) {
syncLoop(0,0, collection);
//...
});
function syncLoop(q, w, collection) {
batch = collection.initializeUnorderedBulkOp({useLegacyOps: true});
for(var e=0;e<words.length;e++) {
batch.insert({a:a, b:b});
}
batch.execute(function(err, result) {
if(err) throw err;
//...
return setTimeout(function() {
syncLoop(qNew,wNew,collection);
}, 0); // Timer to prevent Memory leak
});
}