2013-04-19 3 views
1

mongodb에 대한 이해를 도와주세요. 에는 스레드, 메시지 및 사용자라는 세 가지 모음이 있습니다.메시지 소유자에게

스레드

{ "title" : "1212", "message" : "12121", "user_id" : "50ffdfa42437e00223000001", "date" : ISODate("2013-04-11T19:48:36.878Z"), "_id" : ObjectId("51671394e5b854b042000003") } 

메시지

{ "message" : "text", "image" : null, "thread_id" : "51671394e5b854b042000003", "user_id" : "516d08a7772d141766000001", "date" : ISODate("2013-04-17T15:58:07.021Z"), "_id" : ObjectId("516ec68fb91b762476000001") } 

사용자

{ "user" : "admin", "date" : ISODate("2013-04-16T08:15:35.497Z"), "status" : 1, "_id" : ObjectId("516d08a7772d141766000001") } 

가 어떻게 현재의 thread의 모든 메시지를 표시하고 사용자의 컬렉션 (코멘트) 사용자 이름을 얻을 수 있나요?

이 코드는 사용자 이름

exports.getMessages = function(id, skip, callback) { 
var skip = parseInt(skip); 

messages.find({thread_id: id}).sort({date: 1}).skip(skip).limit(20).toArray(
    function(e, res) { 
    if (e) { 
     callback(e)} 
    else callback(null, res) 
}); 
}; 

Node.js를하지 않고 메시지 만 얻을

+0

잘 작동하지 않는 것 같습니다. – WiredPrairie

답변

1

일반적으로 기본 몽고, 몽고 관계를 유지하기 위해 포함 된 문서 또는 참조를 사용합니다. Here is a link from the mongo docs worth reading.

수동 참조을 메시지 컬렉션의 사용자 모음에 저장하고 있습니다. Mongo 매뉴얼 참조는 참조 된 데이터를 얻기 위해 추가 쿼리가 필요합니다. 이 경우 참조 기반 관계를 사용하면 이 작동하지만 N + 1 쿼리 문제이 발생합니다. 즉, 표시하려는 모든 메시지와 메시지의 원래 쿼리에 대한 추가 쿼리를 작성해야합니다. References are explained in further detail here. 한 가지 해결책은 언어 별 드라이버 지원이 필요한 DBRefs을 통합하는 것입니다.

또 다른 대안은 임베디드 문서를 사용하는 것입니다.이 경우 메시지 개체 내에 포함 된 관련 사용자 개체를 저장합니다. Here is another link to the mongo docs with a great example.이 경우 모든 메시지를 반환하는 단일 쿼리를 만들고 관련된 각 사용자 객체가 내부에 포함됩니다. 임베디드 문서는 중복 데이터를 권장하지만 많은 경우 성능 이점을 제공합니다. 이 모든 정보는 mongo 문서에 설명되어 있으며 mongo의 데이터 모델링을 자세히 이해하기 위해 자세히 읽을 수 있습니다.

또한 mongoose 라이브러리는 꽤 멋지며 참조 용으로 유용한 populate 함수가 있습니다.

관련 문제