如何使用Monk在Javascript中的forEach循环中更新文档
How to update a document in a forEach-loop in Javascript using Monk?
首先是我的文档结构:
{
"_id": "541a8bea74123744b371d38e",
"geometry": {
"type": "Point",
"coordinates": [
5.3435,
51.69554
]
},
"type": "Feature",
"properties": {
}
}
问题是我想在forEach循环中使用update函数添加一个字段。循环有效,我可以迭代集合中的每个文档,但更新函数什么都不做。这就是我所拥有的:
var counter = 0;
collection.find({}, {
stream: true
})
.each(function(doc) {
counter++;
var hash = geohash.encode(doc.geometry.coordinates[1], doc.geometry.coordinates[0], precision = 9);
console.log("id: " + doc._id + " hash: " + hash + " counter= " + counter);
collection.update({
_id: doc._id
}, {
$set: {
"properties.geohash.precision9": hash
}
},
function(err) {
if (err) console.log(err);
}
);
})
.error(function(err) {
// handle error
console.log(err);
})
.success(function(doc) {
// final callback
console.log("added geohash");
res.send({
objects: doc
});
});
我哪里错了?
MongoDb shell 中的工作代码
db.collection.find().forEach(function(item)
{
var hash = ....;
item.properties.geohash.precision9 = hash;
db.collection.save(item);
})
我相信,只要做一些小的更改,你就可以将其与monk 一起使用
我认为您的问题在于您选择的模式。属性是一个子文档,存储在其中的项可以使用"."访问,但是您试图设置另一个子文档geohash的属性。Monk是一个非常轻量级的MongoDB驱动程序,不会支持这么多级别的子文档。我建议将您的模式更改为以下模式:
{
"_id": "541a8bea74123744b371d38e",
"geometry": {
"type": "Point",
"coordinates": [
5.3435,
51.69554
]
},
"type": "Feature",
"properties": {
},
"geohash": {
"precision9": "somevalue"
}
}
我会尝试通过消除子文档来使文档结构变平。在我看来,拥有一个名为properties的子文档是多余的,因为有关当前文档的信息直接属于父级。除非我不了解你的数据。如果是这种情况,请提供更多存储在数据库中的文档,特别是那些具有percision9或其他3个深层属性值的文档。
您可以做的一件事是使用一个额外的变量来构建子文档,并分配值"hash",然后将属性设置为与该新变量相等,尽管这有点难看。这将覆盖以前存储在属性中的任何内容,除非您处理得当:
var newProperties = {
geohash: {
presision9: hash
}
}
collection.update({
_id: doc._id
}, {
$set: {
"properties": newProperties
}
},
function(err) {
if (err) console.log(err);
}
);
})
相关文章:
- Javascript循环不会自我更新
- Jquery-每个循环不更新变量
- 循环对象时更新页面上的DIV元素
- 使用条件for循环更新数组-Javascript
- 在for循环中未正确更新React本机密钥
- 表单中的 jQuery DOM 不会在 for 循环中更新
- 循环遍历表行,获取总计和更新行
- Php循环不会在浏览器上更新
- 在循环锁定浏览器时暂停执行(用fiddles更新)
- 使用循环更新 JSON 属性值
- 我怎么能有一个实时计时器,在3秒的循环内每秒钟更新一次
- 通过响应按钮单击更改表标题,其中行使用 JSTL for 循环更新
- 异步mongodb更新循环中最后一次迭代后的重定向
- AngularJS:在长时间循环期间强制更新DOM(即进度指示器)
- 无限循环当观察父对象时,观察者不更新任何值
- 使用jQuery循环+更新DB
- 从JavaScript for循环更新PHP
- Javascript无限循环更新实体
- 如何使用 for 循环更新 MongoDB 中的对象数组
- 使用嵌套循环更新视图模型挖空