这是我第二次遇到这个问题所以一定是我做错了。我创建了一个游标,其中包含我的集合的所有文档以及投影,并希望迭代此游标,以便我可以更新我的集合。
例如,我对光标进行排序,以便以不同的方式查看我的数据,并根据它的排序方式,我可以就如何更新文档做出明智的决定,甚至删除它...但它似乎不起作用
cursor.each(function(err, doc) {
if(err) throw err;
if(doc==null)
{
return db.close();
}
//Remove
doc.scores.splice(3, 1);
query2 = {"_id":doc._id};
db.collection('highscores').update(query2, doc, function(err, updated) {
if(err) throw err;
console.dir("Updated Doc" + doc._id);
});
console.dir(doc);
有没有更有效的方式来做这件事还是我错过了什么?
答案 0 :(得分:4)
与NodeJS模块一样,特别是NodeJS的MongoDB驱动程序,大多数命令和操作都是异步的。
因此,当光标用尽时,您的代码正在使用db.close
。虽然循环中的某些更新可能已经完成,但在实际有机会更新之前,数据库连接很可能已关闭。
您应该在您提供的示例中使用each
退出return
功能块。
cursor.each(function(err, doc) {
if(err) throw err;
if(doc === null) {
return;
}
//Remove
doc.scores.splice(3, 1);
var query2 = {"_id": doc._id};
db.collection('highscores').update(query2, doc, function(err, updated) {
if(err) throw err;
console.dir("Updated Doc" + doc._id);
});
console.dir(doc);
});
此外,您可能需要查看update
运算符$set
,这可能会优化您正在执行的更新操作(reference)。它仅“设置”您为文档指定的值,而不是更新集合中的整个文档。
同时查看array operators - 它们可能对您正在处理的特定情况有用。