【问题标题】:Replacement update within cursor, MongoDB and Nodejs游标、MongoDB 和 Nodejs 中的替换更新
【发布时间】:2013-11-10 19:19:36
【问题描述】:

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

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

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);

有没有更有效的方法来做到这一点,或者我错过了什么?

【问题讨论】:

  • 为什么要在循环中间关闭数据库连接(db.close)?
  • 啊,是的,这是一个错字:D,更新函数永远不会被调用,因为“更新的文档”永远不会记录。
  • 好的——真正的问题是什么?不清楚你在问什么。更新是异步的...?
  • 问题是没有任何更新。
  • 您确定要在列表返回 null 时关闭数据库连接吗?这将阻止任何进一步的数据库活动(鉴于这都是异步的,更新可能尚未发生)。

标签: javascript node.js mongodb driver


【解决方案1】:

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

也请查看array operators——它们可能对您正在处理的特定情况有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-14
    • 2016-06-18
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 2020-04-10
    相关资源
    最近更新 更多