mongodb分组函数的使用(spring-data-mongodb)
这两天要做mongodb日志的模块,下面记录一下。
一、
首先要导入一批数据,使用springboot来完成。
配置mongodb的复制集:在application.yml文件中配置uri来完成

格式:mongodb://用户名:密码@ip:端口[,ip:端口] [,ip:端口]/数据库名
下面注入mongoTemplate:

二、
Mongodb在java中分组使用应该有两三种方式:可以百度一下
下面我贴上我们项目组使用的代码:
|
@Service("logMongoService") public class LogMongoServiceImpl implements LogMongoService { /** * 按月统计登录次数使用的初始化的js对象 */ private static final String initMonthGroupByJs = "{total:0," + "JanCount:0," + "FebCount:0," + "MarCount:0," + "AprCount:0," + "MayCount:0," + "JuneCount:0," + "JulyCount:0," + "AugCount:0," + "SepCount:0," + "OctCount:0," + "NovCount:0," + "DecCount:0}"; /** * 按月统计登录次数使用的js,mongodb在执行时会自动的执行此脚本 */ private static final String monthGroupByJs = "function(doc, prev){" + "prev.total += 1;" + "if (doc.startTime.getFullYear() == searchYear && doc.startTime.getMonth() == 0) {" + "prev.JanCount += 1;" + "}" + "if (doc.startTime.getFullYear() == searchYear && doc.startTime.getMonth() == 1) {" + "prev.FebCount += 1;" + "}" + "if (doc.startTime.getFullYear() == searchYear && doc.startTime.getMonth() == 2) {" + "prev.MarCount += 1;" + "}" + "if (doc.startTime.getFullYear() == searchYear && doc.startTime.getMonth() == 3) {" + "prev.AprCount += 1;" + "}" + "if (doc.startTime.getFullYear() == searchYear && doc.startTime.getMonth() == 4) {" + "prev.MayCount += 1;" + "}" + "if (doc.startTime.getFullYear() == searchYear && doc.startTime.getMonth() == 5) {" + "prev.JuneCount += 1;" + "}" + "if (doc.startTime.getFullYear() == searchYear && doc.startTime.getMonth() == 6) {" + "prev.JulyCount += 1;" + "}" + "if (doc.startTime.getFullYear() == searchYear && doc.startTime.getMonth() == 7) {" + "prev.AugCount += 1;" + "}" + "if (doc.startTime.getFullYear() == searchYear && doc.startTime.getMonth() == 8) {" + "prev.SepCount += 1;" + "}" + "if (doc.startTime.getFullYear() == searchYear && doc.startTime.getMonth() == 9) {" + "prev.OctCount += 1;" + "}" + "if (doc.startTime.getFullYear() == searchYear && doc.startTime.getMonth() == 10) {" + "prev.NovCount += 1;" + "}" + "if (doc.startTime.getFullYear() == searchYear && doc.startTime.getMonth() == 11) {" + "prev.DecCount += 1;" + "}" + "}"; @Override public void findMonthLogin(MongoPage page, SystemLogQuery systemLogQuery) throws Exception{ //添加年份的限制 也就是查询条件 Criteria[] logType ={Criteria.where("logType").is("2")}; Calendar startCalendar = Calendar.getInstance(); startCalendar.set(year, 0, 1, 0,0, 0); Calendar endCalendar = Calendar.getInstance(); endCalendar.set(year + 1, 0, 1, 0,0, 0); Criteria[] yearCriteria ={Criteria.where("startTime").gte(startCalendar.getTime()).lt(endCalendar.getTime())}; logType = (Criteria[]) ArrayUtils.addAll(logType, yearCriteria); //组织分组时使用的js String initGroupByJs = initMonthGroupByJs; String groupByJs = monthGroupByJs.replace("searchYear", year + ""); //此处开始分组查询 //以name字段进行分组 GroupBy groupBy = new GroupBy("username","name","departmentName"). initialDocument(initGroupByJs). reduceFunction(groupByJs); //执行分组查询 GroupByResults groupByResults = logMongoDao.group(new Criteria().andOperator(logType), groupBy); //取出分组后的数据 这里必须是retval BasicDBList list = (BasicDBList) groupByResults.getRawResults().get("retval"); page.setTotal(list.size()); //用来存放查询到的list集合 List<SystemLogVO> logVOList = new ArrayList<SystemLogVO>(); for (int i = (page.getPageNumber()-1) * page.getPageSize(); i < page.getPageNumber() * page.getPageSize() && i < list.size(); i++) { SystemLogVO systemlog = new SystemLogVO(); //在这个obj中就包含了所有的分组后,我们自定义的哪些属性的值 BasicDBObject obj = (BasicDBObject)list.get(i); systemlog.setName(obj.get("name") == null? "" : obj.get("name").toString()); systemlog.setDepartmentName(obj.get("departmentName") == null?"":obj.get("departmentName").toString()); systemlog.setUsername(obj.get("username") == null?"":obj.get("username").toString()); //获取其中的月份的值 obj.get("total");//总的值 obj.get("JanCount");//根据条件过滤后,统计的1月份的值 obj.get("DecCount"); } } } |
需要说明的一点是,groupByJs这个是一个回调函数,
当mongodb在过滤数据时,会调用这个js方法,doc变量是将正在处理的一条数据传输进来,prev相当于上面定义的initMonthGroupByJs中的js对象,
最后在initMonthGroupByJs中定义的对象会返回给我们,我们可以从prev中取到我们所有需要的数据。
Addition:
https://blog.csdn.net/liming_0820/article/details/78657146
http://www.cnblogs.com/anhaogoon/p/9354248.html
mongodb分组函数的使用(spring-data-mongodb)的更多相关文章
- Spring Data MongoDB 一:入门篇(环境搭建、简单的CRUD操作)
一.简介 Spring Data MongoDB 项目提供与MongoDB文档数据库的集成.Spring Data MongoDB POJO的关键功能区域为中心的模型与MongoDB的DBColle ...
- spring data mongodb 配置遇到的几个问题
一. mongodb 2.2版本以上的配置 spring.data.mongodb.uri = mongodb://newlook:newlook@192.168.0.109:27017/admin ...
- spring data mongodb中,如果对象中的属性不想加入到数据库字段中
spring data mongodb中,如果对象中的属性不想加入到数据库字段中,可加@Transient注解,声明为透明属性 spring data mongodb 官网帮助文档 http://ww ...
- Spring Data MongoDB example with Spring MVC 3.2
Spring Data MongoDB example with Spring MVC 3.2 Here is another example web application built with S ...
- 使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南
1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库.本文介绍使用Spring Data MongoDB来访问mongod ...
- Spring data mongodb 聚合,投射,内嵌数组文档分页.
尽量别直接用 DBObject ,Spring data mongodb 的api 本来就没什么多大用处,如果还直接用 DBObject 那么还需要自己去解析结果,说动做个对象映射,累不累 Spri ...
- JAVA 处理 Spring data mongodb 时区问题
Spring data mongodb 查询出结果的时候会自动 + 8小时,所以我们看起来结果是对的 但是我们查询的时候,并不会自动 + 8小时,需要自己处理 解决方法 1 @JsonFormat ...
- Spring data mongodb ObjectId ,根据id日期条件查询,省略@CreatedDate注解
先看看ObjectId 的json 结构,非常丰富,这里有唯一机器码,日期,时间戳等等,所以强烈建议ID 使用 ObjectId 类型,并且自带索引 Spring data mongodb 注解 @C ...
- Spring data mongodb @CreatedBy@LastModifiedBy@CreatedBy@LastModifiedBy SpringSecurityAuditorAware,只记录用户名
要在Spring data mongodb 中使用@CreatedBy@LastModifiedBy@CreatedBy@LastModifiedBy 这四个注解 必须实现 SpringSecuri ...
- Spring Data MongoDB 三:基本文档查询(Query、BasicQuery)(一)
一.简单介绍 Spring Data MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一 ...
随机推荐
- CSS3 教程
CSS3 教程 CSS 用于控制网页的样式和布局. CSS3 是最新的 CSS 标准. 本教程向您讲解 CSS3 中的新特性. 开始学习 CSS3! 更多:http://www.runoob.com ...
- npdp
我报名比较晚,等缴费最后期限,才缴费,下定决心,开始正式的备考. 我的工作比较忙,备考时间特比较短,从拿到书到考试只有一个月了,心理慌慌的. 在岳老师的帮助下,完成了报名资格申请.拿到备考计划,就赶紧 ...
- 规划将 IaaS 资源从经典部署模型迁移到 Azure Resource Manager
尽管 Azure 资源管理器提供了许多精彩功能,但请务必计划迁移,以确保一切顺利进行. 花时间进行规划可确保执行迁移活动时不会遇到问题. Note 以下指导的主要参与者为 Azure 客户顾问团队,以 ...
- 同时对view延时执行两个动画时候的现象
同时对view延时执行两个动画时候的现象 对于view延时执行了两个动画后,会将第一个动画效果终止了,直接在第一个动画的view的最后的状态上接执行后续的动画效果,也就是说,我们可以利用这个特性来写分 ...
- Effective C++(5) 了解C++默默地编写并调用哪些函数
预热: 一个空的类,当编译器处理过之后,就包含: 一个copy构造函数 一个重载赋值操作符 一个析构函数 一个默认构造函数 Demo: class Empty() { }; // 声明一个空的类 cl ...
- EF学习之CodeFirst(一)--创建Model
一.创建Model 创建Model类有两种方式: 1.直接创建model 所有约束条件都以特性的方式写在model的属性上面,映射到数据库的table表名标识在class上,例如: [Table(&q ...
- 全网数据实时备份方案[inotify,sersync]
环境搭建 0.环境安装 gcc yum install gcc -y 1.安装inotify(源码软件包) 文件下载:https://files.cnblogs.com/files/ftl101 ...
- Shell脚本例子集合
# vi xx.sh 退出并保存 # chmod +x xx.sh # ./xx.sh -2. 调试脚本的方法 # bash -x xx.sh 就可以调试了 . -1. 配置 secureCRT 的设 ...
- Linux下打包压缩war、解压war包和jar命令
情景:把project_a文件夹下的文件打包成project.war 1. 打包 jar -cvf project.war /project_a 说明: -c 创建war包 -v 显示过程信息 -f ...
- Analysis of Algorithms
算法分析 Introduction 有各种原因要求我们分析算法,像预测算法性能,比较不同算法优劣等,其中很实际的一条原因是为了避免性能错误,要对自己算法的性能有个概念. 科学方法(scientific ...