用express和mongoose删除subdoc

时间:2016-12-29 11:32:29

标签: node.js mongodb express mongoose

我想从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

2 个答案:

答案 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。如果不是,您应该以某种方式找到您的用户,这样您就可以使用猫鼬模型的findByIdfindOne方法找到它。

我还在模板中添加了dest.id,因此我们可以使用req.params.id

找到相关目的地的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('/')
        }
      }
    )
});