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

博主在实现分组统计功能时又遇到坑,参见我以前写的博客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日
重庆-传说

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值