2014-09-01 97 views
0

我試圖讓下面的工作,但$set不工作。抓我的頭。正確的方式在Mongo中更新密鑰的值而不刪除舊值?

我們在蒙戈什麼:

{ 
    _id: "123", 
    mechanics: { 
     engine: [ 
      "129hp", 
      "300hp", 
      "500hp" 
     ] 
    } 
} 

,我們有我們的JavaScript對象:

{ 
    mechanics: { 
     brakes: [ 
      "30cm", 
      "60cm", 
      "90cm" 
     ] 
    } 
} 

你怎麼寫的更新查詢使蒙戈DOC這個樣子的?

{ 
    _id: "123", 
    mechanics: { 
     engine: [ 
      "129hp", 
      "300hp", 
      "500hp" 
     ], 
     brakes: [ 
      "30cm", 
      "60cm", 
      "90cm" 
     ] 
    } 
} 

mechanics$set不起作用,因爲它會刪除enginebrakes補充道。

回答

2

,你基本上要的是"dot notation"這意味着,$set您的更新部分出來是這樣的:

{ "$set" : { "mechanics.brakes" : [ "30cm", "60cm", "90cm" ] } } 

要像你展示這個表格你會做這樣的事情處理在JavaScript對象:

var upd = { "$set": {} }; 

var obj = { 
    mechanics: { 
     brakes: [ 
      "30cm", 
      "60cm", 
      "90cm" 
     ] 
    } 
}; 

Object.keys(obj).forEach(function(top) { 
    Object.keys(obj[top]).forEach(function(inner) { 
     upd["$set"][ top + "." + inner ] = obj[top][inner] 
    }); 
}) 

哪個形成基本obj輸入的更新語句並根據需要更新數據庫。

+0

謝謝!是的,我想盡可能多 - 你必須找到一種方法來刪除'mechanics.brakes'對象的父鍵,或者只將值傳入Mongo操作。只是想知道在Mongo中是否有另一個操作符或者其他的操作符只是增加了值而沒有替換現有的值。 – fuzzybabybunny 2014-09-01 07:50:20

+0

@fuzzybabybunny有[幾個更新操作符](http://docs.mongodb.org/manual/reference/operator/update-field/),它們都有不覆蓋文檔中其他現有字段的目的。但是,「點符號」與你想要更新的元素的完整路徑是你在這裏需要的。 – 2014-09-01 08:12:24

相關問題