Node.js 使用$set-mongoose更新字段时保留对象的其余部分
以下是我的收藏结构:Node.js 使用$set-mongoose更新字段时保留对象的其余部分,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,以下是我的收藏结构: { "_id" : ObjectId("59c9e021af4886c9149a28c7"), "userkey" : "r1Et2ZNdW", "devicekey" : "12345", "analog" : { "4" : 458, "6" : 448, "7" : 100 }, "__v" : 0 } 我的收藏更新代码为: DeviceModel.update({_id
{
"_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}
。我应该对我的更新代码做什么更改来持久化对象的其余部分。?或者我需要更改整个逻辑吗?您需要首先将模拟变量对象展平为另一个使用点符号的属性的对象。这使运算符能够正确更新点符号中表示的嵌入字段,而不会更新/删除/影响其他字段
因此,在您的示例中,您可以这样做:
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");
}
);
你试过{$set:{:,…}}吗?很好用。非常感谢。一个小小的疑问,你为什么在id和$set周围使用“”呢?谢谢。还有一个疑问,如果我还有一个展平对象要更新呢。?就像我的收藏一样,我有一个“数字”收藏,我将对象展平并准备好作为setObject2。@JitheshKt我真的不能理解你的问题;我的收藏有“数字”收藏吗?你是说你的设备收藏中有一个“数字”字段吗?我相信这需要一个新的问题,因为编辑现有的答案来适应这一点是不合适的。