2012-05-16 31 views
2

我有一個蒙戈文件看起來像這樣:將變量傳遞給mongo更新?

{ 
    "_id" : '4fb2a4809ad7324ccba1f6b8', 
    "events" : { 
    "4fb2a4809ad7324ccba1f6b9" : {a:{z:1},b:{z:2},c:{z:3}}, 
    "4fb2a4809ad7324ccba1f610" : {a:{z:1},b:{z:2},c:{z:3}} 
    } 
} 

然後我的服務器被髮送一個更新的對象。

update = { 
    _id = '4fb2a4809ad7324ccba1f6b8', 
    event_id: '4fb2a4809ad7324ccba1f610', 
    changed_data: {a:{b:3}} 
} 

A·B = 3已被創建或改變。這並不意味着a = {b:3},因此我不想覆蓋已存儲在文檔中的現有a.z = 1。

如何爲這些更改編寫原子更新?我無法弄清楚的主要問題是如何將變量傳遞到命令中來定位子對象。 (使用node-mongodb-native)

感謝您的幫助!

更新文件看起來像:

{ 
    "_id" : '4fb2a4809ad7324ccba1f6b8', 
    "events" : { 
    "4fb2a4809ad7324ccba1f6b9" : {a:{z:1},b:{z:2},c:{z:3}}, 
    "4fb2a4809ad7324ccba1f610" : {a:{z:1, b:3},b:{z:2},c:{z:3}} 
    } 
} 
+0

是您蒙戈文檔模式「固定」 - 即你必須改變模式的能力的文件稍微讓你的任務更容易,還是不在你的控制之下? –

+0

此外,您可以添加此更新應用後完整對象的外觀?我不清楚你想要什麼,如果它不覆蓋:{z:1},因爲你不能有:{z:1},a:{b:3} - 你不能有兩次相同的密鑰。那麼你是否想要一個:[{z:1},{b:3}]這不是你當前的模式還是你想要別的嗎? –

+0

我控制架構,我編輯顯示完整的文檔。非常感謝Asya! (如果還有更好的方法可以更改客戶端發送的更新對象的模式,我也可以改變它的模式) – fancy

回答

1
for (var id in update.changed_data) { 
    for (var sub_id in update.changed_data[id]) { 
    db.collection.update({ "_id" : update._id, "$atomic" : "true" },{ $set: {'events.' + update.event_id + '.'+ id +'.' + sub_id : update.changed_data[id][sub_id] } }); 
    } 
} 

您還可以檢查此網址:http://www.mongodb.org/display/DOCS/Updating#Updating-ModifierOperations

+0

這個原子是如何的? –

+0

Asya Kamsky,你是對的。我的錯。剛剛更新了我的回覆 –