如何使用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()});
}
});