mongodb获取每个文档的用户信息

时间:2011-12-26 08:27:58

标签: javascript mongodb node.js

我正在尝试显示论坛/类别。我需要获得最新的帖子。问题是我还需要每个帖子的用户数据以及最新的回复。

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()
          }
        })
      })
    });
  })
})

这就是我正在做的事情,对我而言似乎真的很慢/非常不优雅。我这样做是否正确,是否有任何建议加快这一点?

感谢。

2 个答案:

答案 0 :(得分:3)

你应该做的最好的事情是将帖子的作者(用户名和电子邮件或头像)的一些信息嵌入到这些帖子中,这样你就不会对数据库进行多次查询,一个就足够了(确定)你有一些重复的数据,但性能是最佳的。)

如果您不想/不能这样做,您还可以修改第二个查询以查找[array_of_ids_of_the_posts]中的所有作者。这会将您的[number_of_posts]查询减少到只有一个。

答案 1 :(得分:2)

您可以使用一些缓存。例如,你可以在循环期间将用户保存在字典中,这样你只需要在第一次出现时从mongodb获取它。

也许您可以创建某种线程模型,在其中保存有关包含帖子的基本信息,因此您只需要浏览线程。

您可以保存该功能的结果,并在添加新帖子时删除它。所以不会在每次通话时都通过所有帖子。

您不应该使用像sql数据库这样的文档存储。也许最好在创建/编辑帖子时直接生成论坛页面并将整个数据保存在文档中,因此您只需要对mongo进行一次读取调用即可显示。