[英]NodeJS / Mongoose / Express - Unable to delete item from db on click
[英]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.