2017-09-26 96 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。 –