我检查是否存在特定的键值对,如果它们不存在则插入。出于某种奇怪的原因,MongoDB在插入期间抛出错误。任何帮助都会非常感激。
更新#2:添加了整个功能。
{
var connectURL = "mongodb://something";
var mycollection= "something2";
var db;
var col;
async.series([
// Connect to DB
function(callback) {
MongoClient.connect(connectURL,function(error, db2) {
if (error) {console.log("db connect error" + error);callback(error,"db connect error"); return;}
db = db2;
callback(null,"connect success");
});
},
function(callback) {
col = db.collection(mycollection);
callback(null,"collection success");
},
function(callback) {
//console.log ("insert begin ...");
var i = 1;
async.whilst(
function() { return i <= count },
function(callback) {
var mydocument = rows.shift();
col.findOne({ "sha" : mydocument.sha}, function(err, doc) {
console.log ("checked ....", mydocument.sha);
if(doc != null) {
console.log ("Exist :" + mydocument.sha);
} else {
console.log ("Inserting : " + mydocument.sha);
col.insert(mydocument,function(error,result) {
if (error) {
console.log("insert error:" + error);
callback(error);
return;
}
i++;
console.log ("inserted ...");
}); //end insert
} //end else
i++;
});//end findOne
callback(null);
},
function(error) {
callback(error,"insert sucess")
}
); //end async.whilst
},
function (callback){
//console.log ("###########close db");
db.close();
console.log("## end insert: "+ moment().format());
callback(null,"connection closed");
}
], function(error, results) {
if (error) { console.log("error"); }
//console.log(results);
});
}
输出
checked .... 078d40cc537de96310e945a50a60b0084e21d2e1
Inserting : 078d40cc537de96310e945a50a60b0084e21d2e1
insert error:Error: Connection was destroyed by application
TypeError: Cannot read property 'sha' of undefined
答案 0 :(得分:1)
将 cb1 表示为col.findOne
的回调,将 cb2 表示为col.insert
的回调。
cb1 在发出col.insert
而不等待 cb2 完成后返回。由于 cb1 也会增加 i ,因此提供给async.whilst
的测试函数会被评估为false,这会导致async.whilst
认为它已经完成所有迭代。
因此async.series
转到下一个任务,然后发出db.close
。因此,可以在剩余的插入命令完成之前关闭数据库连接。
顺便说一句,您的代码段似乎会通过重复发出col.findOne
来阻塞数据库。 cb1 或 cb2 中的 i 会增加,但async.whilst
可能会在每次重复执行多次测试和执行之前 i 可以递增。也许您可以使用setTimeout(callback,...)
而不是立即调用回调。