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

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

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

这就是我正在做的事情,对我来说这似乎真的很慢/真的不合适。 我是否正确地做了这件事,并有任何build议,加快这一点?

谢谢。

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

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

你可以使用一些caching。 例如,您可以在循环中将用户保存在字典中,因此您只需从mongodb首次获取它即可。

也许你可以创build某种线程模型,在其中保存关于包含post的基本信息,所以你只需要通过线程。

您可以保存该function的结果,并删除它时,添加一个新的职位..所以不会通过每个电话的所有职位。

你不应该像sql数据库一样使用文档存储。 也许最好是在创build/编辑post时直接生成论坛页面,并将整个数据保存在一个文档中,所以你只需要一个读取呼叫到mongo来显示它。