2016-12-29 71 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('/') 
     } 
     } 
    ) 
});