2011-12-26 5 views
1

포럼/카테고리를 표시하려고합니다. 나는 최신 게시물을 얻을 필요가있다. 문제는 최신 게시물뿐만 아니라 각 게시물에 대한 사용자 데이터도 필요하다는 것입니다.mongodb 모든 문서에 대한 사용자 정보 얻기

db.post.find({ 
    "inForum": forumID, 
}, 
{ 
    'sort': [['date', -1]] 
}, 
function(err, cursor) { 
    cursor.count(function(err, count) { 
    cursor.skip(skip).limit(20).toArray(function(err, posts) { 
     var complete = _.after(nodes.length, function() { 
     res.send(posts) 
     }); 

     // for every post get its author info and the latest post info 
     posts.forEach(function (post) { 
     var users = _.pluck(posts, 'user'); 
     user.load(users, function (profiles) { 
      _.each(posts, 
      function(post, k) { 
      if (profiles[post.user]) post.fieldAvatar = profiles[post.user].fieldAvatar; 
      }); 

      if (post.latestReply) { 
      post.load(post.latestReply.id, function (latestReply) { 
       if (latestReply) post.latestReply = latestReply 
       complete() 
      }) 
      } 
      else { 
      complete() 
      } 
     }) 
     }) 
    }); 
    }) 
}) 

이것은 내가하고있는 일이며, 나에게는 정말로 느리고/정말로 유쾌한 것처럼 보입니다. 이 작업을 올바르게 수행하고 있으며이를 가속화하기위한 조언이 있습니까?

감사합니다.

답변

3

여기에서해야 할 일은 게시물 작성자 (사용자 이름 & 이메일 또는 아바타)에 대한 게시물을 게시물에 포함시켜 데이터베이스에 여러 번 쿼리하지 않아도됩니다. 중복 데이터가 있지만 성능이 가장 좋습니다).

두 번째 쿼리를 수정하여 [array_of_ids_of_the_posts]의 모든 작성자를 찾을 수도 있습니다. 그러면 [number_of_posts] 쿼리가 하나만 줄어 듭니다.

+0

그래, 실제로이 최적화가 다른 곳에서 코드에 있지만이 예제에 포함시키는 것을 잊었습니다. user.load는 루프를 수행하는 것이 아니라 ": users"에서 $를 사용합니다. – Harry

+0

언급 한 것 중 하나 (선호하는 첫 번째)를 수행하면 잘됩니다. – alessioalex

+0

고마워, 흥미롭게도 나는 그것을 사용자와 함께했지만 배열 대신에 최신 게시물을위한 루프를 사용했다. 어리석은 저, 고마워요 – Harry

2

일부 캐싱을 사용할 수 있습니다. 예를 들어 루프 중에 사전에 사용자를 저장할 수 있으므로 mongodb의 첫 번째 항목에서만 사용자를 가져와야합니다.

아마도 포함 된 게시물에 대한 기본 정보를 저장하는 일종의 스레드 모델을 만들 수 있습니다. 따라서 스레드를 거치기 만하면됩니다.

새 게시물이 추가되면 함수 결과를 저장하고 삭제할 수 있습니다. 따라서 모든 호출에 대해 모든 게시물을 검토하지는 않습니다.

sql 데이터베이스와 같은 문서 저장소를 사용하면 안됩니다. 게시물을 작성/편집 할 때 포럼 페이지를 직접 생성하고 전체 데이터를 문서에 저장하는 것이 더 좋을 수 있으므로 mongo를 읽기 위해 하나만 읽으면됩니다.

관련 문제