Monogdb使用 MapReduce进行分组统计查询

Stella981
• 阅读 485
/**

  * 

  * @param businessNo 

  * @param beginTime 开始时间

  * @param endTime 结束时间

  * @param pageNo  页码

  * @param pageSize 分页大小

  * @return

  */

 public static List<DBObject> query(Integer businessNo,Date beginTime,Date endTime,int pageNo,int pageSize){


  StringBuffer map = new StringBuffer();

  map.append("function(){ ");

  map.append("  var t = new Date(this.createTime);");

  map.append("  emit({ ");

  map.append("     orgId:this.orgId,");

  map.append("     operatorId:this.operatorId,");

  map.append("     objId:this.businessParam.objId,");

  map.append("     creatDate:t.getFullYear() +'-'+(t.getMonth() + 1)+'-'+t.getDate()");

  map.append("   },");

  map.append("   {count:1}");

  map.append("  ); ");

  map.append("} ");

  log.info(">>>>>>>map:{}",map.toString());

  

  StringBuffer reduce = new StringBuffer();

  reduce.append("function(key, values) {");

  reduce.append("  var total = 0;");

  reduce.append("  for (var i=0; i<values.length; i++) { ");

  reduce.append("     total += values[i].count;");

  reduce.append("  } ");

  reduce.append("  return {count: total}; ");

  reduce.append("} ");

  log.info(">>>>>>>reduce:{}",reduce.toString());

  

  StringBuffer finalize = new StringBuffer();

  finalize.append("function(key, rvalues) { ");

  finalize.append("   var sum = 0; ");

  finalize.append("   if(rvalues.count>0){ ");

  finalize.append("      rvalues.get='true'; ");

  finalize.append("   }else{ ");

  finalize.append("      rvalues.get='false'");

  finalize.append("   } ");

  finalize.append("   return rvalues; ");

  finalize.append("}");

  log.info(">>>>>>>finalize:{}",finalize.toString());

  

  //查询条件

  DBObject query = new BasicDBObject();

  query.put("businessNo", businessNo);

  query.put("operatorId", new BasicDBObject("$exists", true).append("$ne", 0));

  query.put("createTime", new BasicDBObject("$gte", beginTime.getTime()).append("$lte", endTime.getTime()));

  query.put("businessParam.objId", new BasicDBObject("$exists", true));

 
  DBObject command = new BasicDBObject();

  command.put("mapreduce", "MyLogs");

  command.put("query", query);

  command.put("map", map.toString());

  command.put("reduce", reduce.toString());

  command.put("out", "MapReduceCommand.OutputType.INLINE");

  command.put("verbose", true);

  

  DBCollection db = MongoDbInit.getDb().getCollection("MyLogs");

  command.put("finalize", finalize.toString());

  MapReduceOutput out = db.mapReduce(command);

  

  DBObject having = new BasicDBObject();

  having.put("value.get", "true");

  

  DBObject orderBy = new BasicDBObject();

  orderBy.put("createTime", -1);//按createTime倒序排  

  

  int skip = (pageNo-1)*pageSize;

  List<DBObject> resultList = new ArrayList();

  resultList = out.getOutputCollection().find(having).sort(orderBy).skip(skip).limit(pageSize).toArray();

  return resultList;

 }

数据结构

{

  "_id" : ObjectId("52f9c392b7603fe75cff49e7"),

  "deviceId" : "ffffffff-d0b9-867d-191b-921900000000",

  "operationTime" : NumberLong("1392100740000"),

  "operatorType" : 1,

  "operatorId" : 3587,

  "platform" : "android",

  "businessStatus" : 1,

  "sessionId" : "",

  "orgId" : 104,

  "businessName" : "活动详情",

  "createTime" : NumberLong("1392100242676"),

  "businessParam" : {

    "objId" : 653,

    "time" : 715,

    "objType" : 1

  },

  "businessNo" : 1101

}
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Parameter 'name' not found. Available parameters are [arg1, arg0, param1, param2]
!(https://oscimg.oschina.net/oscnet/0c930a24d551e0970e306d79a64f7148999.gif)!(https://oscimg.oschina.net/oscnet/3bca3884ca653a179e799d56df36d4622b3.png)解决方法:<selectid"sel
Stella981 Stella981
2年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
2年前
Java日期时间API系列23
  有时候,往往需要统计某个时间区间的销量等问题,这就需要准确的起始时间,获取准确开始时间00:00:00,获取准确结束时间23:59:59。下面增加了一一些方法,获取当天起始时间,昨天起始时间,当前月第一天开始时间,当前月最后一天结束时间,上个月第一天开始时间,上个月最后一天结束时间,某个指定月的起始结束时间等等。其中月份最后一天往往因为月份不同和
Wesley13 Wesley13
2年前
PHP中查询指定时间范围内的所有日期,月份,季度,年份
/查询指定时间范围内的所有日期,月份,季度,年份@param$startDate指定开始时间,Ymd格式@param$endDate指定结束时间,Ymd格式@param$type类型,day天,month月份,quart
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这