繁体   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