如何从NodeJs / express / mongoose中的Object中删除项?

时间:2016-10-16 20:25:47

标签: node.js mongodb express

我知道之前有人问过,但没有一个答案适合我。 在我的应用程序中,我在MongoDb中有一个用户集合。这些用户集合有一个名为' segActuacions'可以在表单中修改。此表单将此Object发送到路由器:

{
    "segActuacions.0.date": "27/09/2016",
    "segActuacions.0.body": "first item",
    "segActuacions.1.date": "27/09/2016",
    "segActuacions.1.body": "second item"
}

路由器有这一行去控制器:

router.delete('/seg_act_upd_EE/:id/actDel/:i', 
    sessionController.loginRequired,  
    userController.actuaDelete
);

其中':id'User-id':i'segActuacions的索引

Controller有这段代码:

exports.actuaDelete = function (req, res) {
    var userId = req.params.id;
    var userI = req.params.i;
    var usr = req.body;

    delete usr['segActuacions.userI.date'];
    delete usr['segActuacions.userI.body'];

    models.User.findByIdAndUpdate(userId, usr, function (error, user){
        if (error) res.json(error);
        res.redirect('/list_EE');
    });
}

我想删除对象的字段'i'(例如:if i=0,我想要删除"segActuacions.0.date""segActuacions.0.body",...但没有任何反应。

2 个答案:

答案 0 :(得分:1)

如果您只是想从req.body对象中删除密钥,然后使用其余密钥更新您的集合,请按照以下示例进行操作:

exports.actuaDelete = function (req, res) {
    var userId = req.params.id;
    var userI = req.params.i;
    var usr = req.body;

    delete usr["segActuacions."+ userI +".date"];
    delete usr["segActuacions."+ userI +".body"];

    models.User.findByIdAndUpdate(userId, usr, function (error, user){
        if (error) res.json(error);
        res.redirect('/list_EE');
    });
}

要从集合中删除字段,最好的方法是使用 $unset 运算符,因为delete会从对象中删除键并使用更新的对象更新集合不会从集合中删除实际字段。

实质上,您使用dot notation来正确识别要删除的字段。例如,您希望实现以下mongo shell更新操作:

db.users.update(
    { "_id" : userId },
    {
        "$unset": {
            "segActuacions.1.date" : "",
            "segActuacions.1.body" : ""        
        }
    }
)

这将删除segActuacions数组中索引为1的位置元素中的字段。

使用您的控制器方法绑定所有这些,您可以构造一个类似于

的更新对象
{
    "$unset": {
        "segActuacions.1.date" : "",
        "segActuacions.1.body" : ""        
    }
}

,例如

exports.actuaDelete = function (req, res) {
    var userId = req.params.id;
    var userI = req.params.i;
    var usr = {};

    usr["segActuacions."+ userI +".date"] = "";
    usr["segActuacions."+ userI +".body"] = "";

    models.User.findByIdAndUpdate(userId, { "$unset": usr }, function (error, user){
        if (error) res.json(error);
        res.redirect('/list_EE');
    });
}

答案 1 :(得分:0)

请注意,删除操作无效,因为您使用userI作为字符串而不使用变量值。此外,更新只会更新对象中的字段。

但我认为您应该使用$unset,如下所示:

var updateObj = {};
updateObj['segActuacions'] = {};
updateObj['segActuacions'][userI] = {};
updateObj['segActuacions'][userI]['body'] = '';
updateObj['segActuacions'][userI]['date'] = '';

var update = { $unset:  updateObj };

models.User.findByIdAndUpdate(userId, update, function (error, user){
    if (error) res.json(error);
    res.redirect('/list_EE');
});

(此代码可以改进并且未经过测试)