这两天要做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)的更多相关文章

  1. Spring Data MongoDB 一:入门篇(环境搭建、简单的CRUD操作)

    一.简介 Spring Data  MongoDB 项目提供与MongoDB文档数据库的集成.Spring Data MongoDB POJO的关键功能区域为中心的模型与MongoDB的DBColle ...

  2. spring data mongodb 配置遇到的几个问题

    一. mongodb 2.2版本以上的配置 spring.data.mongodb.uri = mongodb://newlook:newlook@192.168.0.109:27017/admin ...

  3. spring data mongodb中,如果对象中的属性不想加入到数据库字段中

    spring data mongodb中,如果对象中的属性不想加入到数据库字段中,可加@Transient注解,声明为透明属性 spring data mongodb 官网帮助文档 http://ww ...

  4. 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 ...

  5. 使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南

    1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库.本文介绍使用Spring Data MongoDB来访问mongod ...

  6. Spring data mongodb 聚合,投射,内嵌数组文档分页.

    尽量别直接用 DBObject  ,Spring data mongodb 的api 本来就没什么多大用处,如果还直接用 DBObject 那么还需要自己去解析结果,说动做个对象映射,累不累 Spri ...

  7. JAVA 处理 Spring data mongodb 时区问题

    Spring data mongodb 查询出结果的时候会自动 + 8小时,所以我们看起来结果是对的 但是我们查询的时候,并不会自动 + 8小时,需要自己处理 解决方法 1   @JsonFormat ...

  8. Spring data mongodb ObjectId ,根据id日期条件查询,省略@CreatedDate注解

    先看看ObjectId 的json 结构,非常丰富,这里有唯一机器码,日期,时间戳等等,所以强烈建议ID 使用 ObjectId 类型,并且自带索引 Spring data mongodb 注解 @C ...

  9. Spring data mongodb @CreatedBy@LastModifiedBy@CreatedBy@LastModifiedBy SpringSecurityAuditorAware,只记录用户名

    要在Spring data mongodb 中使用@CreatedBy@LastModifiedBy@CreatedBy@LastModifiedBy  这四个注解 必须实现 SpringSecuri ...

  10. Spring Data MongoDB 三:基本文档查询(Query、BasicQuery)(一)

    一.简单介绍 Spring Data  MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一 ...

随机推荐

  1. Java EE大作业之创造class类出现问题-------Implicit super constructor Object() is undefined for default constructor. Mu

    这个学期一直在忙着考驾照的事情,眼看就要期末了.我的大学生活的最后一个大的作业也要来临了.说实话这个学期真的是没有之前的两个学期努力了.不知道是快要毕业的缘故还是真的是把心思用在了驾照上,想着在这次放 ...

  2. can't start Git: git.exe

    can't start Git: git.exe :不能启动Git 这是因为Git的可执行文件的路径不正确,需要手动设置,. 找到设置Git的窗口 然后修改一下路径就行了 点击OK就可以了.

  3. 12 步 30 分钟,完成用户管理的 CURD 应用 (react+dva+antd)

    Getting Started https://github.com/dvajs/dva/blob/master/docs/GettingStarted.md -------------------- ...

  4. Hello,world的几种写法!

    这是我的第一篇文章!开个玩笑~~“你知道回字的四种写法吗”? printf("Hello,world!"); cout<<"Hello,world!" ...

  5. Python库安装注意事项

    由于一些python库依赖其它库或者其它组件,因此,在使用pip3命令安装python库的时候,经常会报错,告知缺失哪些组件. 但是, 开启VPN后,就没有再碰到类似错误,相关组件都是自动被安装. 因 ...

  6. 弧形菜单2(动画渐入)Kotlin开发(附带java源码)

    弧形菜单2(动画渐入+Kotlin开发) 前言:基于AndroidStudio的采用Kotlin语言开发的动画渐入的弧形菜单...... 效果: 开发环境:AndroidStudio2.2.1+gra ...

  7. Selenium IDE录制脚本

    一.当Selenium IDE中Format没有转换格式时,操作:Options—Options...—勾选Enable experimental features

  8. C# Array类的Sort()方法

    Array类实现了数组中元素的冒泡排序.Sort()方法要求数组中的元素实现IComparable接口.如System.Int32 和System.String实现了IComparable接口,所以下 ...

  9. 【 PostgreSQL】工作中常用SQL语句干货

    接触gp数据库近一年的时间,语法上和其他数据库还是有些许不同,工作中常用的操作语句分享给大家! -- 建表语句 create table ods.ods_b_bill_m ( acct_month t ...

  10. Oracle案例09——ORA-12154: TNS:could not resolve the connect identifier specified

    DG处理的问题还是蛮多的,但这次遇到一个比较奇葩的事情,表面配置.网络都没啥问题,但主备的同步始终有问题,经过多次调整参数.重新部署问题依旧,最终还是求助mos问题得以解决,现将处理过程记录如下: 一 ...