簡體   English   中英

如何從 NodeJs/express/mongoose 中的對象中刪除項目?

[英]How can I delete an item from an Object in NodeJs/express/mongoose?

我知道以前有人問過這個問題,但沒有一個答案對我有用。 在我的應用程序中,我在 MongoDb 中有一個用戶集合。 這些用戶集合有一個名為“segActuacions”的數組字段,可以在表單中修改。 此表單將此對象發送到路由器:

{
    "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的索引

控制器有這個代碼:

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" ,...但沒有任何反應。

如果您只是想從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會從對象中刪除鍵,並且使用更新的對象更新集合不會從集合中刪除實際的字段。

本質上,您使用點符號來正確識別要刪除的字段。 例如,您希望實現以下 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');
    });
}

請注意,您的刪除不起作用,因為您使用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');
});

(此代碼可以改進,未經測試)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM