[英]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.