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

时间:2017-09-26 05:29:23

标签: node.js mongodb mongoose

以下是我的收藏结构:

["First returned", "second returned", 123]

该集合的更新代码为:

plugins: [
    new webpack.ProvidePlugin({
        $: path.resolve(__dirname, "libs/jquery-3.2.1.min.js")
    })
]

我想更新“模拟”对象的一个​​(或多个)值。我可能有也可能没有“模拟”集合的全部价值。这意味着我大部分时间只有{ "_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}。我应该对更新代码进行哪些更改以保留Object的其余部分。还是我需要改变我的整个逻辑?

1 个答案:

答案 0 :(得分:2)

您需要首先将analog变量对象展平为另一个具有使用点表示法的属性的对象。这使 $set 运算符能够正确更新点符号中表示的嵌入字段,而无需更新/删除/影响其他字段。

所以,在你的例子中你可以解决这个问题:

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