【问题标题】:How do you retrieve "related" documents in MongoDB?如何在 MongoDB 中检索“相关”文档?
【发布时间】:2013-03-09 04:42:09
【问题描述】:

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

我正在尝试在我的博客应用程序中呈现一个显示博客文章列表的视图。每个帖子都有一个作者 ID 的引用。我正在尝试对每个帖子进行第二次查询,以获取每个参考文献的完整作者文档。一切都是异步的让我很困惑。

在获取博客文章列表的回调中,我将遍历每篇文章并进行第二次调用以获取相关用户。我不知道如何仅在所有帖子都添加了作者文档后才呈现视图。我什至不确定我是否做对了这些。如何参考其他文档来完成我想做的事情?

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

【问题讨论】:

    标签: javascript node.js mongodb express mongoskin


    【解决方案1】:

    您可以在 nodejs https://github.com/caolan/async 中使用异步库。这有助于以串行或并行方式执行一组函数,一旦所有这些都完成,就会调用最终回调,您可以在其中进行渲染部分。


    由问题作者编辑:

    这是一个很好的建议,效果很好!方法如下:

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

    });

    【讨论】:

    • 这看起来会让一些异步的东西更容易。您认为您可以帮助我从我的问题中的示例代码中制作一个示例吗?
    • 我想通了,效果很好!我希望你不介意我用我的实现编辑了你的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多