如何检索MongoDB中的“相关”文档?

我为MongoDB使用node.js,express和MongoSkin驱动程序。

我试图在我的博客应用程序中显示一个显示博客文章列表的视图。 每篇文章都有一个作者ID的参考。 我试图对每个post进行第二次查询,以获取每个引用的完整作者文档。 一切asynchronous都让我感到困惑。

在获取博客文章列表的callback中,我正在循环阅读每篇文章,并进行第二次调用以获取关联的用户。 一旦所有post都添加了作者文档,我不知道如何渲染视图。 我甚至不确定我是否正在做这个权利。 如何参考其他文件来完成我想要做的事情?

// getPageOfPosts is a custom helper that accepts the page number and number of items to retrieve. db.collection('blogPosts').getPageOfPosts(req.param('page') || 1, 3, function (err, blogPosts) { if (err) req.next(err); blogPosts.forEach(function (blogPost) { db.collection('users').findOne({ _id: blogPost.authorId }, function (err, user) { if (err) req.next(err); blogPost.author = user; }); }); var viewModel = { posts: blogPosts }; res.render('blog/index', viewModel); }); 

您可以在nodejs https://github.com/caolan/async中使用asynchronous库。 这有助于以串行或并行方式执行一组函数,并且一旦所有这些完成,就会调用一个最终的callback函数,在那里你可以执行你的渲染部分。


按问题编辑作者:

这是一个很好的build议,工作得很好! 就是这样:

 db.collection('blogPosts').getPage(req.param('page') || 1, 3, function (err, blogPosts) { if (err) req.next(err); var addUsersArray = []; blogPosts.forEach(function (blogPost) { addUsersArray.push(function (callback) { db.collection('users').findOne({ _id: blogPost.author }, function (err, user) { if (err) callback(err); blogPost.author = user; callback(null, blogPost); }); }); }); async.parallel(addUsersArray, function (err, blogPosts) { if (err) req.next(err); var viewModel = { posts: blogPosts }; res.renderView('blog/index', viewModel); }); }); 

以下也运作良好

 db.collection('blogPosts').getPageOfPosts(req.param('page') || 1, 3, function (err, blogPosts) { if (err) req.next(err); async.each(blogPosts,function (blogPost,cb) { db.collection('users').findOne({ _id: blogPost.authorId }, function (err, user) { if (err) req.next(err); blogPost.author = user; cb(err); }); },function(error) { var viewModel = { posts: blogPosts }; res.render('blog/index', viewModel); }); 

});