使用java操作mongodb实现按天分组统计

由于需要使用mongodb来统计数据,但是网上的资料实在是少的可怜,也是我收集资料能力不行,反正就是找不到我要的,又没有人可以问,刚接触这个数据库,强大是真的,但是一个小需求就搞掉了我几天时间,生气.刚入行的小白,编码能力逻辑都还垃圾的不行,写这个的目的就是想着那一天有个人刚刚好需要,搜到这个能给他提供一点点思路就行,别因为刚开始被打击一下就不干这行了(内心有过这个想法).

因为数据库里存的时间是时间戳,又要按天统计,还要按照id分组做聚合运算,所以使用管道我是搞不出来,找了老长时间找到了一个叫GroupCommand的东西,说不太清楚,反正感觉跟mapreduce差不多,可以js写分组条件什么的,只是使用它完成一个小需求,具体底层和是不是最简单的我现在不管.需求:按天统计付费总计,详情x元y人,付费人数.代码如下

Query query = Query.query(criteria);
        BasicDBObject initial = new BasicDBObject();
        initial.put("uidMap",new HashMap<>());
        initial.put("countUser",0);
        initial.put("countPay",0);
        initial.put("moneyMap",new HashMap<>());//用Map存x元y人
        String reduce = "function Reduce(doc, out) { " +
                "        out.countPay+=doc.payMoney; "+//统计付费总额
                "        if(doc.uid != null){    "+
                "            if(out.uidMap[doc.uid] == null) {"+
                "                out.countUser ++;"+//去重uid,countUser为人数
                "                out.uidMap[doc.uid] = 1;"+
                "            }"+
                "        }"+
                "        if(doc.payMoney != null){    "+
                "            if(out.moneyMap[doc.payMoney] == null) {"+//key为付费金额,value为人数.取出key为numberLong(30),后面切割一下就行
                "                out.moneyMap[doc.payMoney] = 1;"+
                "            }else{" +
                "                out.moneyMap[doc.payMoney]++" +
                "          }"+
                "       }"+
                " }";
        String keyf = "function(doc){ " +//将数据库中时间戳转日期按照2018-1-30分组
                "   var date = new Date(doc.payTime); " +
                "   var dateKey = '' + date.getFullYear()+ '-' + (date.getMonth()+1) + '-' + date.getDate();" +
                "   return {'strData':dateKey};  " +
                " }";
        DBCollection collection = mongoTemplate.getCollection("game_user_pay");
        GroupCommand xx = new GroupCommand(collection, keyf, query.getQueryObject(), initial, reduce, null);

        DBObject  object =  mongoTemplate.getCollection("game_user_pay").group(xx);
后面使用映射输出,用Calendar按天返回,美美哒的解决

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值