javascript - 游标、MongoDB 和 Nodejs 内的替换更新

标签 javascript node.js mongodb driver

这是我第二次遇到这个问题,所以一定是我做错了什么。我创建了一个游标,其中包含带有投影的集合的所有文档,并且想要迭代该游标,以便更新我的集合。

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

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 功能 block 。

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

看看array operators同样,它们在您正在处理的特定情况下可能很有用。

关于javascript - 游标、MongoDB 和 Nodejs 内的替换更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19893988/

相关文章:

javascript - Pascal 三 Angular 形数组未在 HTML 中显示?我该如何解决?

javascript - 无法让 jQuery 创建正确的 HTML

javascript - 使用字符串访问数组中的对象

c - 如何捕获输入设备并防止其默认行为

javascript - Node.js + TypeScript : Unclear syntax with type script compiled code

javascript - 从 Sequelize.js "query"(MySQL) 获取最后插入的 id

javascript - 是否可以在 javascript 控制台中定义一个 int32 值?

javascript - 无需编辑 MEAN 中的整个条目即可将数据推送到 MongoDB

javascript - 将除 mongodb 之外的所有内容插入数据库

javascript - 如何在 jQuery 中加载页面?