2011-03-15 9 views
7

나는 여기에 내 머리를 긁적니다. 노드 프로젝트에서는 평소와 같이 보이고, 뭔가 잘못하고 있는지, 버그가 있는지 잘 모르겠습니다.몽구스는 임베디드 문서를 제거하지 않을 것입니다.

나는 서비스라는 임베디드 워드 프로세서를 여러 개 가질 수있는 서버 스키마를 가지고 있습니다. 문제가 생기고 있지만 서버 객체에서 개별 서비스를 성공적으로 제거 했더라도 저장하라는 메시지가 데이터베이스에서 제거되지는 않습니다. 저장 기능은 내가 한 모든 변경 사항을 저장하고 새로운 임베디드 문서를 푸시하기 때문에 작동합니다. 이미 존재하는 문서를 제거하지 않고 있기 때문입니다.

app.put('/server/:id', function(req, res, next){ 
    app.Server.findOne({_id: req.params.id}, function(err, server) { 
    server.updated = new Date(); 
    ... 

    for (var num = _.size(req.body.server.services) - 1; num >= 0; num--){ 
     // Is this a new service or an existing one 
     if (server.services[num]) { 
     // Is it marked for deletion? If so, delete it 
     if (req.body.server.services[num].delete == "true") { 
      server.services[num].remove() 
     } else { // else, update it 
      server.services[num].type = req.body.server.services[num].type 
      ... 
     } 
     } else { 
     // It's new, add it 
     delete req.body.server.services[num]["delete"] 
     server.services.push(req.body.server.services[num]); 
     } 
    } 

    server.save(function(err){ 
     if (!err) { 
     req.flash('success', 'Server updated') 
     } else { 
     req.flash('error', 'Err, Something broke when we tried to save your server. Sorry!') 
     console.log(err) 
     } 
     res.redirect('/') 
    }); 
    }) 
}); 

그래서 제거()가 실제로 서비스를 제거한다 :

여기 내 코드의 비교적 간단한 예이다. 저장하기 전에 server.toObject()를 수행하면 거기에 없습니다. 저장시 데이터베이스에서 제거하지 않는 이유는 무엇입니까?

편집 : 버전 번호가 도움이 될 것이라고 생각합니다. [email protected], [email protected] [email protected]

+0

동일한 문제가 있습니다. – Carlosedp

답변

3

이 문제를 임시 해결할 수있는 방법을 발견했습니다.

내가 한 것은 임베디드 된 문서를 배열에로드하고 하나를 스플 라이스하여 삭제하고 배열을 대체하는 것입니다. 이런 식으로 뭔가 :

var oldusers = dl.users; 
oldusers.splice(dl.users.indexOf(req.currentUser.id), 1); 
dl.users = oldusers; 
dl.save(function(err) {... 

나는 알고 문서의 크기에 따라 그 것이다

+0

그랬습니다. 고맙습니다! – mattmcmanus

+0

이 방법이 효과적 일 수 있습니다.하지만이 방법을 해결 방법으로 사용해야하는 이유를 알고있는 사람이 있습니까? –

4

나는 당신의 예를 테스트하지 후로 내가 틀릴 수도 있지만, 몽구스가 감지되지 같은이 소리 삽입 된 문서가 수정되었음을 나타냅니다.

schema types documentation page에서

:

는 스키마가없는 타입이기 때문에

, 당신은 당신이 좋아하는 다른 어떤 값을 변경할 수 있지만 몽구스는 자동/감지 이러한 변경을 저장하는 기능을 잃는다. Mongoose에 혼합 유형의 값이 변경되었다고 알리려면 . 방금 변경 한 혼합 유형에 대한 경로를 전달하는 문서의 .markModified (경로) 메서드를 호출하십시오.

person.anything = { x: [3, 4, { y: "changed" }] }; 
person.markModified('anything'); 
person.save(); // anything will now get saved 

그래서 대답은 markModified() 함수를 사용하는 것처럼 간단 할 수 있습니다.

+1

markModified가 자식에서 작동하지 않는 경우를 제외하고는 완벽 할 것입니다. 참조 : https://github.com/LearnBoost/mongoose/issues/435 – k00k

+0

제 경우에 일했습니다. 고마워요! – JMax

+0

Carlosep의 솔루션은 소수의 시나리오에서만 나를 위해 일했습니다. 이것은 어느 곳에서나 작동하는 것으로 보이며 더 정확한 "방법"인 것처럼 보입니다. 감사! –