用猫鼬更新

时间:2013-12-16 14:51:35

标签: node.js mongodb mongoose

我需要设置一个嵌套数组的对象,其属性为“default = true”,但我只需要一个具有此属性的对象,其他人不能拥有此属性。

示例:

{
    "_id": "xxxxx",
    "name": "Jmae",
    "desktops": [
        {
           "_id": "xxxxx",
           "name": "Mike",
           "default": true
        },
        {
           "_id": "xxxxx",
           "name": "Aris"
        },
        {
           "_id": "xxxxx",
           "name": "John"
        }
    ]
}

这只是设置,但不要删除:

 var filter = {
            "_id": platformId,
            "desktops._id": desktopId
        },
        updateParams = {
            "$set": {
                "desktops.$.default": true
            }
        };
    crud.findOneAndUpdate(filter, updateParams, null, callback);

下一个代码可以正常工作,但是它很大:

crud.findByIdNeed(platformId, null, null, function (err, platform) {

    // En caso de error
    if (err) {
        callback(err);
        return;
    }

    _.each(platform.desktops, function (desk, i) {

        if(desk._id.toString() === desktopId){
            platform.desktops[i].default = true;
        }else if(platform.desktops[i].default){
            delete platform.desktops[i].default;
        }

    });

    platform.save(callback);

});

我怎样才能做得更好?

1 个答案:

答案 0 :(得分:2)

也许一种替代方法是重新构建您的架构,将默认桌面作为platform中的一个属性,它将引用相关桌面的_id。例如,您的架构可能类似于:

{
    "_id": "xxxxx",
    "name": "Jmae",
    "defaultDesktop": 1932, // Contains the ID of the relevant desktop
    "desktops": [
        {
           "_id": 1932, // This is your default desktop
           "name": "Mike"       
        },
        {
           "_id": "xxxxx",
           "name": "Aris"
        },
        {
           "_id": "xxxxx",
           "name": "John"
        }
    ]
}

这样可以省去迭代桌面设置/删除默认属性的麻烦。您可以在一个地方更改默认值。