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时关闭数据库连接吗?这将阻止任何进一步的数据库活动(如果这都是异步的,那么更新可能还没有发生)。