2016-12-29 2 views
0

Я хотел бы удалить поддоку от пользователя mongoDB. Тем не менее, Mongoose документы, которые охватывают функцию УДАЛИТЬ кажутся легким, и как таковые, моя функция возвращает следующее сообщение об ошибке:Удаление субдока с помощью экспресс и mongoose

TypeError: Cannot read property 'id' of undefined 

Что идет не так в этом куске кода? Как сделать доступным идентификатор subdoc, чтобы функция могла его удалить?

// 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. Если нет, вы должны каким-то образом найти своего пользователя, так что вы можете найти его с помощью findById или findOne методов модели mongoose.

Также я добавил dest.id в шаблоне, чтобы мы могли найти соответствующий пункт назначения по его идентификатору с помощью req.params.id

Примечание, что вы могли бы использовать method-override промежуточное программное обеспечение и использовать DELETE метод вместо GET в более стандартным образом.

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('/') 
     } 
     } 
    ) 
}); 
Смежные вопросы