sails-mongo 使用 groupBy 进行分组遇到的坑

来源:互联网 发布:js分页思路 编辑:程序博客网 时间:2024/06/07 12:17

博主在实现分组统计功能时又遇到坑,参见我以前写的博客sails-mysql 使用 groupBy 进行分组遇到的坑

今天我们来谈谈mongodb的分组功能,需要注意的地方同上,groupBy 要与 sum, average, min, max 成对出现,这里不再多说。

这次遇到的需求比较复杂,涉及到分组、排序、分页、对比排名。首先要分组,然后排序,然后分页,最后对比排名。

先放代码,看博主是怎么征服这些需求的,哈哈哈哈哈哈哈

var field = req.body['field'] || 'keyword';//要分组的字段,默认关键字var starttime = req.body['starttime'] || 1451577600;//时间戳var starttime2 = req.body['starttime2'] || 1451577600;var endtime = req.body['endtime'] || 1454255999;var endtime2 = req.body['endtime2'] || 1454255999;var page = req.body.page || 1;var limit = req.body.limit || 10;var skip = (page-1)*limit;var query = req.body['query'] || '';//搜索词    query = Util.RemoveXSS(query);var match1 = { visitime: { '$gte': parseInt(starttime), '$lte': parseInt(endtime) } };var match2 = { visitime: { '$gte': parseInt(starttime2), '$lte': parseInt(endtime2) } };if(query!=''){    match1[field] = { $regex: query, $options: '$i' };    match2[field] = { $regex: query, $options: '$i' };}//数量条件var where = [    {        $match: match1    },    {        $group: {            _id: '$'+field,            value: { $sum: 1 }        }    },    { $sort: { value: -1 } }];//对比条件var where2 = [    {        $match: match2    },    {         $group: {             _id: '$'+field,            value: { $sum: 1 }        }    },    { $sort: { value: -1 } }];Model.native(function(err, collection) {    if(err){ return next(err); }    var logDoc = collection.aggregate(where);//总数据    logDoc.toArray(function (err, log) {        if(err){ return next(err); }        var count = log.length;        logDoc.skip(parseInt(skip)).limit(parseInt(limit))//分页        .toArray(function (err, data1) {            if(err){ return next(err); }            collection.aggregate(where2).toArray(function (err, data2) {                if(err){ return next(err); }                var i = data1.length;//现在排名                while (i--) {                    data1[i].name = data1[i]['_id'];                    data1[i].value2 = skip+i+1;                    var j = data2.length;//对比排名                    while (j--) {                        if(data1[i]['_id'] == data2[j]['_id']){                            //排名变化                            data1[i].value3 = j - i;                            break;                        }                        //避免过量对比                        if(j+limit+100 < data2.length){break;}                    }                }                return res.send({                    count: count,                    data: data1                });            });        });    });});

2017年9月13日
重庆-传说

原创粉丝点击