Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 游标、MongoDB和Nodejs中的替换更新_Javascript_Node.js_Mongodb_Driver - Fatal编程技术网

Javascript 游标、MongoDB和Nodejs中的替换更新

Javascript 游标、MongoDB和Nodejs中的替换更新,javascript,node.js,mongodb,driver,Javascript,Node.js,Mongodb,Driver,这是我第二次遇到这个问题,所以一定是我做错了什么。我创建了一个游标,其中包含集合中的所有文档以及投影,并希望遍历该游标,以便更新集合 例如,我对光标进行排序,以便以不同的方式查看数据,并根据排序方式对如何更新文档甚至删除文档做出明智的决定。。。但它似乎不起作用 cursor.each(function(err, doc) { if(err) throw err; if(doc==null) { return db.close(); }

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

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

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
退出每个
功能块

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);
});
此外,您可能还需要查看
更新
操作符
$set
,这可能会优化您正在执行的更新操作()。它只“设置”您为文档指定的值,而不是更新集合中的整个文档


还可以看看——它们在您正在处理的特定情况下可能很有用。

与NodeJS模块,尤其是NodeJS的MongoDB驱动程序一样,大多数命令和操作都是异步的

因此,当光标用尽时,您的代码正在使用
db.close
。虽然循环中的一些更新可能已经完成,但数据库连接很可能在任何更新之前就已经关闭了

您应该使用您提供的示例中的
return
退出每个
功能块

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);
});
此外,您可能还需要查看
更新
操作符
$set
,这可能会优化您正在执行的更新操作()。它只“设置”您为文档指定的值,而不是更新集合中的整个文档


看一下,它们在你正在处理的特定情况下可能有用。

为什么你要在循环中间关闭DB连接(<代码> dB?关闭<代码>)?啊,是的,这是一个错字:D,更新函数永远不会被调用,因为“更新的文档”从来没有登录过。好了,实际问题是什么?不清楚你在问什么。更新是异步的…?问题是没有更新任何内容。您确定要在列表返回null时关闭数据库连接吗?这将阻止任何进一步的数据库活动(并且考虑到这一切都是异步的,更新可能还没有发生)。为什么要在循环中间关闭DB连接(<代码> db?关闭<代码>)?啊,是的,这是一个错字:D,更新函数永远不会被调用,因为“更新的DOC”从来没有登录过。好的-实际的问题是什么?不清楚你在问什么。更新是异步的…?问题是没有更新任何内容。您确定要在列表返回null时关闭数据库连接吗?这将阻止任何进一步的数据库活动(如果这都是异步的,那么更新可能还没有发生)。