如何从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用作string而不使用variables值。 同时更新只会更新对象中的字段。

但我认为你应该使用$ 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'); }); 

(这个代码可以改进,没有经过testing)