[英]Replacement update within cursor, MongoDB and Nodejs
这是我第二次遇到此问题,所以一定是我做错了什么。 我创建了一个游标,其中包含我的收藏中所有带投影的文档,并且想要遍历此游标,以便可以更新我的收藏。
例如,我对光标进行了排序,以便可以以不同的方式查看我的数据,并且根据数据的排序方式,我可以就如何更新文档甚至删除文档做出明智的决定……但它似乎不起作用。
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);
有没有更有效的方法可以做到这一点?
如典型的NodeJS模块,尤其是NodeJS的MongoDB驱动程序,大多数命令和动作都是异步的。
因此,当游标耗尽时,您的代码正在使用db.close
。 尽管循环中的某些更新可能已经完成,但在任何实际有机会更新之前,数据库连接很可能已关闭。
您应该通过在提供的示例中使用return
来退出each
功能块。
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
,它可能会优化正在执行的更新操作( 参考 )。 它仅“设置”您为文档指定的值,而不更新集合中的整个文档。
还要看一下数组运算符 -在您正在处理的特定情况下,它们可能会很有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.