2016-12-29 63 views
0

我想从mongoDB用户中删除一个subdoc。然而,覆盖删除功能的猫鼬文档似乎光,正因为如此,我的函数返回以下错误:删除明快和猫鼬的subdoc

TypeError: Cannot read property 'id' of undefined 

什么错在这段代码?我如何使subdoc 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

分享您的架构或响应 – Sam

回答

0

用户是猫鼬模型。这是一组用户文档。用户集合中的每个用户文档都有一个名为的子分区,目标地址为;所以目的地被放置在每个不在用户模型上的用户上。

你首先应该找到相关的用户文档,然后从它的目的地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。如果你不应该以某种方式找到你的用户,这样你就可以用猫鼬模型findByIdfindOne方法找到它。

而且我在模板中添加dest.id所以我们可以发现,通过使用req.params.id

注意,你可以使用method-override中间件和使用DELETE方法,而不是得到一个更标准的方式将其ID相关的目的地。

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('/') 
     } 
     } 
    ) 
});