代码之家  ›  专栏  ›  技术社区  ›  Jithesh Kt

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

  •  1
  • Jithesh Kt  · 技术社区  · 7 年前

    以下是我的收藏结构:

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   chridam Gino Claudi    7 年前

    你需要先把 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");
        }
    );