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