1

如何使用来自 mongodb 的 node.js 和 mongoose 在视图中正确聚合结果。我的程序员同事想出了以下路线,将事件和博客文章聚合到一个按天排序的内容列表/视图中(如果“已发布”和“推广”都等于 1)。这样做的问题是聚合结果列表实际上只是分成两部分(首先显示事件,然后显示博客),而它们应该以按日期排序的真正混合方式呈现。我会在 mysql 中使用 join 或 groupby,但是如何在带有 mongodb 的 node.js 应用程序中进行这种类型的聚合?Ps,我们使用 express 和 mongoose 以防万一。

更新:我们已经为两者(事件和博客)定义了架构,并且已经存储了数千条记录。所以现在的问题是,我们可以做这个客户端还是我们必须创建一个索引(另一个集合)?我正在阅读 mongodb 的聚合框架和 map reduce,但我不确定这些中的任何一个是否可以帮助我。

    app.get('/promoted/content/:page?', userSession, function(req, res, next) {
var today = todayTimestamp();

var limit = 10;
if(req.params.page) {
    var skip = req.params.page * limit;
} else {
    var skip = 0;
}

async.parallel({
    blogs: function(callback){
        app.Blog.find()
            .where('status').equals(1)
            .where('promote').equals(1)
            .sort('sticky', -1)
            .sort('created', -1)
            .populate('userId')
            .exec(function(err, blogs) {
                if (err) {
                    console.log(err);
                } else {
                    callback(null, blogs);
                }
        });
    },
    events: function(callback){
        app.Event.find()
            .where('status').equals(1)
            .where('promote').equals(1)
            .sort('sticky', -1)
            .sort('created', -1)
            .populate('userId')
            .exec(function(err, events) {
                if (err) {
                    console.log(err);
                } else {
                    callback(null, events);
                }
        });
    }
},
// callback function to render page and pass in all data
function(err, results){

    //add type field to results for logic in mixed output
    for(i = 0; i < results.blogs.length; i++) {
        results.blogs[i].type = 'blog';
    }
    for(i = 0; i < results.events.length; i++) {
        results.events[i].type = 'event';
    }

    //combine results from blogs and events and sort the results
    var promoted = results.events.concat(results.blogs);
    var outputted = false;
    promoted.sort(function( a, b )
    {
      // Sort by key of modification date in each array
      if ( a['changed'] == b['changed'] ) return 0;
      return a['changed'] < b['changed'] ? -1 : -1;
    });

    //create a subset
    var subset = new Array();
    for(var i = skip; i < (limit + skip); i++) {
        subset.push(promoted[i]);
    }

    //check mobile
    if(isMobile(req)) {
        res.render('mobile/fragments/block_posts', { posts: subset, user: req.session.user, message: req.flash()});
    } else {
        res.render('fragments/block_posts', { posts: subset, user: req.session.user, message: req.flash()});
    }
});
4

0 回答 0