2014-02-23 85 views
1

我想更新MongoDB文檔(使用Javascript數據庫驅動程序)。我想在一個JSON對象傳遞並有一個更新的文件...是這樣的:使用JSON對象更新mongodb文檔

Provider.prototype.updateProfile = function(username, profile, callback) { 
    this.getCollection(function(error, profile_collection) { 
    if(error) callback(error); 
    else { 
     profile_collection.update(
     {username: username}, 
     {profile}, 
     function(error, profile){ 
      if(error) callback(error); 
      else callback(null, profile) 
     }); 
    } 
    }); 
}; 

我想這是一個通用的功能,因此,如果文檔結構的變化我不有,以改寫。目前,我只能通過在更新使用

{"$set": {x:profile.x, y:profile.y}} 

得到這個工作,沒有任何人有一個通用的解決方案,這樣我可以在任何配置文件傳遞:

profile = { .... } 
+0

「profile」文件是否包含_id? – Yoann

+0

我正在更新根據說用戶名...'{用戶名:用戶名},{$集:{...}'---和「配置文件」沒有_id,但它可以... – avrono

+1

是我得到的,我問,因爲如果你有你的個人資料文件中的_id,你可以使用收集()。保存哪些更新/替換完整的文檔 – Yoann

回答

0

沒有什麼錯誤使用保存(),但更新()也將工作,如果該文件已經存在的,並且更新文件並不需要包含_id,因爲它會通過更新保存()。 save()的主要優點是,如果文檔不存在(稱爲「upsert」),它將插入文檔。例如,該蒙戈shell腳本:

db.collection.insert({_id:0, x:1, y:2}) 
printjson(db.collection.findOne()) 

db.collection.update({_id:0}, {x:3, y:4, z:5}) 
printjson(db.collection.findOne()) 

db.collection.save({_id:0, x:6, y:7, z:8, w:9}) 
printjson(db.collection.findOne()) 

產生這樣的輸出,顯示出更新()也更新由ID選擇的完整的文檔:

{ "_id" : 0, "x" : 1, "y" : 2 } 
{ "_id" : 0, "x" : 3, "y" : 4, "z" : 5 } 
{ "_id" : 0, "x" : 6, "y" : 7, "z" : 8, "w" : 9 } 
0

如果你使用一個平臺,像流星,你不會可以選擇使用save(),因爲平臺不「支持」全部的MongoDB命令。正如Bruce所說的,我已經成功通過一個帶有update()的JSON對象,並且在更新完整文檔時沒有問題。 我用流星做了以下工作:

var myUpdatedData = {item1:"data1",item2:"data2",item3:"data3"}; 
MyCollection.update({_id: existingID}, myUpdatedData));