2016-12-29 1 views
0

mongoDB 사용자로부터 서브 디렉토리를 제거하고 싶습니다. 그러나, 삭제 기능을 커버 몽구스의 문서는 빛을 것, 그리고 같은 내 함수는 다음과 같은 오류 반환 :express와 mongoose로 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

사용자는 몽구스 모델입니다. 그것은 사용자 문서 모음입니다. User 컬렉션에있는 모든 사용자 문서는 이라는 하위 문서를 가지고 있습니다.; 그래서 목적지은 사용자 모델이 아닌 모든 사용자에 배치됩니다.

먼저 다음의 목적지 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 몽구스 모델 방법을 사용하여 찾을 수 있습니다.

또한 나는 그래서 우리는 당신이 method-override 미들웨어를 사용하고 는보다 표준 방식 대신 GET의 방법을 삭제 사용할 수 req.params.id

를 사용하여 ID를 기준으로 관련 대상을 찾을 수 있습니다 템플릿에 dest.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('/') 
     } 
     } 
    ) 
}); 
관련 문제