使用$ set-mongoose更新字段时,保留对象的其余部分

以下是我的collections结构:

{ "_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} 。 我应该做什么更改我的更新代码来坚持其余的对象。 还是我需要改变我的整个逻辑?

您需要首先将analogvariables对象平铺到具有使用点符号的属性的另一个对象中。 这使得$set操作符可以正确地更新以点表示法表示的embedded字段,而无需更新/删除/影响其他字段。

所以,在你的例子中,你可以去做这件事:

 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"); } );