2011-12-26 66 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使用'「$ in」:users'而不是循環執行 – Harry 2011-12-26 10:30:04

+0

如果你執行了任何一個(最好是第一個)提到的東西,那麼你會很好。 – alessioalex 2011-12-26 10:32:20

+0

謝謝,有趣的是我用它做了它,但用循環來傳遞數組。愚蠢的我,謝謝 – Harry 2011-12-26 10:40:08

2

你可以使用一些緩存。例如,您可以在循環中將用戶保存在字典中,因此您只需從mongodb首次獲取它即可。

也許你可以創建某種線程模型,在其中保存關於包含帖子的基本信息,所以你只需要通過線程。

您可以保存該函數的結果,並在添加新帖子時將其刪除。因此,不會在每次調用時都瀏覽所有帖子。

您不應該使用像sql數據庫一樣的文檔存儲。也許最好在創建/編輯帖子時直接生成論壇頁面,並將整個數據保存在文檔中,因此您只需向mongo發送一個讀取呼叫即可顯示。