由于需要使用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按天返回,美美哒的解决