我想从mongoDB用户中删除一个subdoc。但是,覆盖remove函数的Mongoose文档似乎很轻松,因此,我的函数返回以下错误:
TypeError: Cannot read property 'id' of undefined
这段代码出了什么问题?如何使子文件ID可访问,以便该函数可以删除它?
// Remove a destination from the user
router.get('/delete', function(req, res, next) {
var subdoc = User.destinations.id(_id).remove()
user.save(function (err) {
if (err) return handleError (err)
})
})
玉模板
each dest in user.destinations
.destination
li= dest.airport
li= dest.daysAway
li= dest.day
li= dest.month
a(href='/delete') Delete this entry
答案 0 :(得分:0)
用户是一个猫鼬模型。它是用户文档的集合。 User集合中的每个用户doc都有一个名为 destinations 的子目录;所以目的地放置在不在用户模型上的每个用户上。
首先应找到相关的用户文档,然后从目标subdoc中删除所需的目标:
// Remove a destination from the user
router.get('/delete/:id', function(req, res, next) {
// Find the user
User.findById(req.user._id, function(err, user) {
if ( user ) {
// Find subdoc
var subdoc = user.destinations.id(req.params.id);
// Remove subdoc
subdoc.remove();
// Save user
user.save(function (err) {
if (err) return handleError(err);
});
}
});
});
玉模板:
each dest in user.destinations
.destination
li= dest.airport
li= dest.daysAway
li= dest.day
li= dest.month
a(href='/delete/' + dest._id ) Delete this entry
我假设您的用户已在request
上安装了身份验证过程,因此我们可以通过req.user._id
获取其ID。如果不是,您应该以某种方式找到您的用户,这样您就可以使用猫鼬模型的findById
或findOne
方法找到它。
我还在模板中添加了dest.id
,因此我们可以使用req.params.id
注意您可以使用method-override中间件并以更标准的方式使用 DELETE 方法代替GET。
答案 1 :(得分:0)
在互联网上绊倒了一些代码后,我发现这个解决方案很有说服力。
router.get('/delete/:id', function(req, res, next) {
User.update(
{ "_id": req.user.id },
{ "$pull": { "destinations": { "_id": req.params.id } } },
function(err, numAffected) {
if(err){
console.log(err)
} else {
res.status(200).send()
res.redirect('/')
}
}
)
});