2014-10-29 51 views
1

首先我的文档的结构:如何使用Monk更新JavaScript中的forEach循环中的文档?

{ 
    "_id": "541a8bea74123744b371d38e", 
    "geometry": { 
    "type": "Point", 
    "coordinates": [ 
     5.3435, 
     51.69554 
    ] 
    }, 
    "type": "Feature", 
    "properties": { 
    } 
} 

的事情是我想用更新功能在foreach循环中添加一个字段。循环工作,我可以迭代集合中的每个文档,但更新函数什么也不做。这是我的:

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

我在哪里错了?

回答

1

MongoDB中的工作准则外壳

db.collection.find().forEach(function(item) 
{ 
    var hash = ....; 
    item.properties.geohash.precision9 = hash; 
    db.collection.save(item); 
}) 

我相信,在一些小的修改u能与和尚

+0

的东西是保存方法更新或插入MongoDB中的文件是否存在或不是一个ID。因此在Monk中你有更新或插入命令。 – justauser 2014-10-29 15:38:14

+0

您可以使用** db.collection.update(item._id,item)**; – Disposer 2014-10-29 15:49:46

1

使用它,我相信你的问题是与您所选择的模式。属性是一个子文档,存储在其中的项目可以用'。'访问,但是你试图设置另一个子文档geohash的属性。 Monk是一个非常轻量级的MongoDB驱动程序,不会支持这种级别的子文档。我建议改变你的架构如下:

{ 
    "_id": "541a8bea74123744b371d38e", 
    "geometry": { 
    "type": "Point", 
    "coordinates": [ 
    5.3435, 
    51.69554 
    ] 
}, 
"type": "Feature", 
"properties": { 
}, 
"geohash": { 
    "precision9": "somevalue" 
} 
} 

我会尝试通过消除子文档展平文档结构。在我看来,有一个名为属性的子文档是多余的,因为有关当前文档的信息直接在父级。除非我想念你的数据。如果是这种情况,请提供更多存储在数据库中的文档,特别是那些具有percision9或其他3个深度属性值的文档。

虽然有点难看,但您可以做的一件事是使用额外的变量来构建子文档并赋值'hash',然后将属性设置为等于该新变量。除非你处理得当,这将覆盖先前保存在任何性质:

var newProperties = { 
geohash: { 
    presision9: hash 
} 
} 

collection.update({ 
 
     _id: doc._id 
 
     }, { 
 
     $set: { 
 
      "properties": newProperties 
 
     } 
 
     }, 
 
     function(err) { 
 
     if (err) console.log(err); 
 
     } 
 
    ); 
 
    })