在游标,MongoDB和Nodejs中替换更新

Replacement update within cursor, MongoDB and Nodejs

本文关键字:替换 更新 Nodejs 游标 MongoDB      更新时间:2023-09-26

这是我第二次遇到这个问题,所以一定是我做错了什么。我创建了一个游标,其中包含带有投影的集合的所有文档,并希望循环访问此游标,以便可以更新我的集合。

例如,我对光标进行排序,以便我可以以不同的方式查看数据,并且根据它的排序方式,我可以就如何更新文档甚至删除它做出明智的决定......但它似乎不起作用。

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,这可能会优化您正在执行的更新操作(参考)。它仅"设置"您为文档指定的值,而不是更新集合中的整个文档。

也看看数组运算符 - 它们在您正在处理的特定情况下可能很有用。