2017-09-26 92 views
1

字段時,堅持對象的其餘部分下面是我收集的結構:

{ 
    "_id" : ObjectId("59c9e021af4886c9149a28c7"), 
    "userkey" : "r1Et2ZNdW", 
    "devicekey" : "12345", 
    "analog" : { 
     "4" : 458, 
     "6" : 448, 
     "7" : 100 
    }, 
    "__v" : 0 
} 

的收集我的更新的代碼是:

DeviceModel.update({_id : device.id}, {$set : {"analog" : analog}}, function(err, doc){ 
      if(err) throw err; 
      console.log("Device switches updated"); 
}); 

我想更新的一個(或更多)「模擬」對象的值。我可能會或可能沒有完整的「模擬」集合的價值。這意味着大多數時候我只會有{"7" : 200}{"6" : 500}等等。如果我在我的上述更新代碼中使用它,它會起作用。但問題是對象中剩餘的項目將被刪除。也就是說,「模擬」對象將變成{"7" : 200}。我應該對我的更新代碼做什麼更改以保留對象的其餘部分。還是我需要改變我的整個邏輯?

+0

你試過{$組:{,...}}? – Abhijit

回答

2

您需要首先將analog變量對象展平爲具有使用點符號的屬性的另一個對象。這使得操作員能夠正確地更新以點表示法表示的嵌入字段,而不更新/刪除/影響其他字段。

所以,在你的榜樣,你可以去這個問題:

let setObject = {}; 
Object.keys(analog).forEach(function (key) { 
    setObject[`analog.${key}`] = analog[key]; 
}); 

DeviceModel.update(
    { '_id': device.id }, 
    { '$set': setObject }, 
    function(err, doc) { 
     if(err) throw err; 
     console.log("Device switches updated"); 
    } 
); 
+0

完美地工作。非常感謝。一個小小的疑問,爲什麼你用''圍繞_id&$ set? –

+0

@JitheshKt最好解釋[這裏](https://stackoverflow.com/questions/4348478/) – chridam

+0

謝謝。還有一個疑問,如果我有一個更扁平的對象來更新,會怎樣?就像我的集合有一個'數字'集合,我把對象弄平並準備好setObject2。 –