2014-10-29 55 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); 
 
     } 
 
    ); 
 
    })