javascript - How do I properly aggregate mongodb results from two separate content types in my node.js app? -
how aggregate results in view using node.js & mongoose mongodb. programmer colleague came following route aggregate event , blog posts in 1 list/view of content sorted day (if both "published" , "promoted" equal 1). trouble list of aggregate results split 2 (first events display, blogs display) when should render in mixed fashion sorted date. use join or groupby in mysql how type of aggregation in node.js app mongodb? ps, we're using express , mongoose in case helps.
update: we've defined schema 2 (events , blogs), , there thousands of records stored. question is, can client side or have create index (another collection)? i'm reading on mongodb's aggregation framework , map reduce i'm not sure if either of can me @ point.
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 render page , pass in data function(err, results){ //add type field results logic in mixed output for(i = 0; < results.blogs.length; i++) { results.blogs[i].type = 'blog'; } for(i = 0; < results.events.length; i++) { results.events[i].type = 'event'; } //combine results blogs , events , sort results var promoted = results.events.concat(results.blogs); var outputted = false; promoted.sort(function( a, b ) { // sort key of modification date in each array if ( a['changed'] == b['changed'] ) return 0; return a['changed'] < b['changed'] ? -1 : -1; }); //create subset var subset = new array(); for(var = skip; < (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()}); } });
Comments
Post a Comment