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我真的不能理解你的问题;我的收藏有“数字”收藏吗?你是说你的设备收藏中有一个“数字”字段吗?我相信这需要一个新的问题,因为编辑现有的答案来适应这一点是不合适的。