在游标,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
,这可能会优化您正在执行的更新操作(参考)。它仅"设置"您为文档指定的值,而不是更新集合中的整个文档。
也看看数组运算符 - 它们在您正在处理的特定情况下可能很有用。
相关文章:
- 无法从 jQuery RSS Feed 中的 localStorage 动态替换类
- Javascript循环不会自我更新
- setState是替换密钥中的所有现有数据,还是只更新需要更新的数据
- 数据表 - 使用 fnUpdate 更新行将替换不同的行
- 三.js:更新几何图形与替换
- 在游标,MongoDB和Nodejs中替换更新
- 使用 javascript 更新后替换 JSON 对象
- AJAX 数据 - 替换 HTML 与更新值属性
- 带有更新按钮.js D3 将新数据添加到旧数据而不是替换旧数据
- 计数器未更新,其值将替换为当前值
- 如何通过单击按钮更新计数器和替换文本
- 如何在不替换现有字段的情况下更新MongoDB中的记录
- 如何使用http.post方法替换或更新文本区域中的现有内容
- 如何将appendto替换为其他内容以更新数据
- 替换/重建输入元素和更新PrototypeJS焦点/模糊函数
- AngularJS视图没有't在替换值时更新
- MongoDb's$(update)不更新数组's元素,而是替换它
- Webpack 热模块替换插件在对文件进行更改时不更新页面
- 为什么这段代码性能不高?更新内部文本vs替换整个标签
- Knockout如何知道当它所存在的对象被替换时更新其派生属性的绑定?