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的操作,上一 ...
随机推荐
- mybatis大框架
MyBatis 开源的数据持久化层框架 实体类与SQL语句之间建立映射关系 一:MyBatis前身是IBatis,本是Apache的一个开源的项目, 基于SQL语法,简单易学 ,是耦合度降低,方便 ...
- C++学习笔记(5)----重载自增自减运算符
自增运算符“++”和自减运算符“--”分别包含两个版本.即运算符前置形式(如 ++x)和运算符后置形式(如 x++),这两者进行的操作是不一样的.因此,当我们在对这两个运算符进行重载时,就必须区分前置 ...
- Nuget Tips
Install-Package时老是提示找不到Available Source,研究了下Nuget Package Manager的配置.发现有两个地方可以改: 1.Visual Studio中Too ...
- 学习笔记:Nginx反射代理使用缓存和删除其缓存文件的方法
使用nginx做cache服务器 需求就是缓存android的软件包,后缀名是apk.话不多说,直接上配置,供参考: a-->nginx.conf user www www; worker_pr ...
- Sys.WebForms.PageRequestManagerParserErrorException: 常见的原因是:通过调用Response.Write()修改相应时,将启用响应筛选器、HttpModules或服务器追踪
Sys.WebForms.PageRequestManagerParserErrorException: 无法分析从服务器收到的消息,之所以出现此错误,常见的原因是:通过调用Response.Writ ...
- c# winfrom 皮肤切换 控件 IrisSkin2.dll 使用
在c#应用程序中使用IrisSkin2.dll美化界面 IrisSkin2.dll 下载地址:http://d.download.csdn.net/down/1694982/sgear 一.添加控件I ...
- 《Java并发编程实战》文摘
更新时间:2017-06-03 <Java并发编程实战>文摘,有兴趣的朋友可以买本纸质书仔细研究下. 一 线程安全性 1.1 什么是线程安全性 当多个线程访问某个类时,不管运行时环境采用何 ...
- December 31st 2016 Week 53rd Saturday
In every triumph, there's a lot of try. 每个胜利背后都有许多尝试. This Year is over, and let it be. It would be ...
- [EffectiveC++]item04:Make sure the objects are initialized before they're used
28 页 C++规定,对象的成员变量的初始化动作发生在进入构造函数本体之前. 构造函数的一个较佳的写法是,使用所谓的member initialization list替换赋值动作. 29页 但请立下 ...
- linux服务器安全配置10大技巧
1.禁止ping/etc/rc.d/rc.localecho 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all2.对用户和口令文件进行权限控制chmod 6 ...