2014-04-05 8 views
1

배열 내의 각 객체에도 객체 배열이 들어있는 객체 배열이 포함 된 mongoose를 사용하여 문서를 업데이트해야합니다. 이것에 대한노드와 몽구스. 객체 배열 내부에서 객체 배열 쿼리 및 업데이트

의사 코드는 것 같은 뭔가 '객실'객체의 배열입니다

user.rooms[{where roomname = 'abc123'}].messages.push({message: 'hello', from: 'james'}) 

.

'messages'는 자체적으로 room 배열에있는 room 객체 내부에있는 객체 배열입니다.

배열에 $ in mongoose와 $ elemMatch를 사용하는 것과 관련하여 쿼리를 작성하는 방법에 대해 혼란 스럽습니다. 도트 구문, $ 세트 대 $ 푸시 등 ...

var roomname = 'abc123'; 

User.findOneAndUpdate({'rooms.name' : room},{ */* WHAT GOES HERE? */* }, {upsert:true} function (err, messagesDoc) { 

    if (err){ 
     return done(err); 
    }  

    if (messagesDoc) {   

    } else { 


    } 

    }); 

이게 가능합니까? 대신 사용자와 방을위한 별도의 콜렉션을 사용해야합니까?/UPDATE

편집 그래서 나는이 문제를 알아 내려고 노력하고 내가 더 가까워지고 있어요 생각하지만 지금 오류를 얻고있다.

C:\[PATH]\app\node_modules\mongoose\node_modules\mquery\lib\utils.js: 
26 
    if (/ObjectI[dD]$/.test(obj.constructor.name)) { 
        ^
RangeError: Maximum call stack size exceeded 
DEBUG: Program node app exited with code 8 

나는 또한 내가 쿼리의 첫 번째 부분은 볼 수 추가해야합니다 :

User.findOneAndUpdate({ 'local.rooms.name' : room }, 
    {$push: {'local.rooms.$.messages': chatmessage}}, 

    function(err, doc) { 

}); 

이 내가 점점 오전 오류는 다음과 같습니다

내가 지금 사용하고있는 쿼리입니다 일. 내가 그것을 찾기 위해 그것을 찾으면 나는 그 결과를 로그 아웃 할 수있다. 오류를 일으키는 업데이트 개체 인 것 같습니다.

답변

0

findOneAndUpdate를 사용하여 몽구스 모델을 저장하고 $ push를 사용하여 모델 객체를 데이터베이스로 푸시 할 수없는 것처럼 보입니다. 이 코드를 $ push로 변경하면 모델과 동일한 속성으로 생성 된 객체 (물론 자동 생성 ID가없는 객체)가 데이터베이스에 잘 삽입됩니다.

버그 또는 의도 된 기능인 경우 확실하지 않습니다.

실제 솔루션은 데이터베이스를 재구성하여 개체 배열로 중첩 된 하위 문서를 더 이상 갖지 않았습니다. 즉, 방을위한 새로운 컬렉션을 만들었습니다. 또한 findOne() 함수를 사용하여 findOneAndUpdate() 함수 대신 save() 함수를 사용했습니다. 이렇게하면 아무런 문제없이 몽구스 모델을 저장할 수 있습니다.