Skip to content

Instantly share code, notes, and snippets.

@imjoey
Created June 10, 2015 06:17
Show Gist options
  • Save imjoey/eeba909bab50c6b3bde0 to your computer and use it in GitHub Desktop.
Save imjoey/eeba909bab50c6b3bde0 to your computer and use it in GitHub Desktop.
aggregate by nodejs mongoose library @ mongodb
var express = require('express');
var router = express.Router();
var Task = require('../models/task');
var Auditlog = require('../models/auditlog');
var User = require('../models/user');
var auditprivileges = require('../common').audits;
var _ = require('underscore');
var mongoose = require('../common').mongoose;
var Schema = mongoose.Schema;
var TaskSchema = new Schema({
taskname: { type: String, default: '' },
project: { type: Schema.Types.ObjectId, ref: 'Project'},
// 1*16: dev, 2*16: test, 4*16: project manager, 8*16: tech manager
tasktype: { type: Number, default: 16 },
date: { type: Date, default: Date.now },
rdmtask: { type: String, default: '' },
worker: { type: Schema.Types.ObjectId, ref: 'User' },
wholequality: { type: Number, min: 0, max: 100, default: 0 },
process: { type: Number, min: 0, max: 100, default: 0 },
docquality: { type: Number, min: 0, max: 100, default: 0 },
satisfied: { type: Number, min: 0, max: 100, default: 0 },
innovate: { type: Number, min: 0, max: 100, default: 0 },
standard: { type: Number, min: 0, max: 100, default: 0 },
shares: { type: Number, min: 0, max: 100, default: 0 },
weight: { type: Number, min: 0.8, max: 1.2, default: 1 },
// final score
score: Number,
remark: { type: String, default: '' },
mixed: Schema.Types.Mixed
});
/**
* get ranks
*
* @return {[type]} [description]
*/
router.get('/ranks', function(req, res, next) {
Task.aggregate(
// show both total and average score, ordered by average asc.
{ $group: { _id: '$worker', totalscore: { $sum: '$score' }, avgscore: { $avg: '$score'}}},
{ $project: { _id: 1, totalscore: 1, avgscore: 1 } },
{ $sort: { avgscore: -1 }},
function(err, idscores) {
if (err) return next(err);
User.populate(idscores,
{ path: '_id', model: 'User', select: 'name'},
function(err, userscores) {
res.json(userscores);
}
);
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment