簡體   English   中英

游標,MongoDB和Nodejs中的替換更新

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM