如何在我的node.js应用程序中正确聚合两个单独内容类型的mongodb结果?

时间:2013-04-05 23:27:29

标签: javascript node.js mongodb express mongoose

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

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

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

0 个答案:

没有答案