这两天要做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. CSS3 教程

    CSS3 教程 CSS 用于控制网页的样式和布局. CSS3 是最新的 CSS 标准. 本教程向您讲解 CSS3 中的新特性. 开始学习 CSS3!  更多:http://www.runoob.com ...

  2. npdp

    我报名比较晚,等缴费最后期限,才缴费,下定决心,开始正式的备考. 我的工作比较忙,备考时间特比较短,从拿到书到考试只有一个月了,心理慌慌的. 在岳老师的帮助下,完成了报名资格申请.拿到备考计划,就赶紧 ...

  3. 规划将 IaaS 资源从经典部署模型迁移到 Azure Resource Manager

    尽管 Azure 资源管理器提供了许多精彩功能,但请务必计划迁移,以确保一切顺利进行. 花时间进行规划可确保执行迁移活动时不会遇到问题. Note 以下指导的主要参与者为 Azure 客户顾问团队,以 ...

  4. 同时对view延时执行两个动画时候的现象

    同时对view延时执行两个动画时候的现象 对于view延时执行了两个动画后,会将第一个动画效果终止了,直接在第一个动画的view的最后的状态上接执行后续的动画效果,也就是说,我们可以利用这个特性来写分 ...

  5. Effective C++(5) 了解C++默默地编写并调用哪些函数

    预热: 一个空的类,当编译器处理过之后,就包含: 一个copy构造函数 一个重载赋值操作符 一个析构函数 一个默认构造函数 Demo: class Empty() { }; // 声明一个空的类 cl ...

  6. EF学习之CodeFirst(一)--创建Model

    一.创建Model 创建Model类有两种方式: 1.直接创建model 所有约束条件都以特性的方式写在model的属性上面,映射到数据库的table表名标识在class上,例如: [Table(&q ...

  7. 全网数据实时备份方案[inotify,sersync]

    环境搭建 0.环境安装   gcc  yum install gcc -y 1.安装inotify(源码软件包) 文件下载:https://files.cnblogs.com/files/ftl101 ...

  8. Shell脚本例子集合

    # vi xx.sh 退出并保存 # chmod +x xx.sh # ./xx.sh -2. 调试脚本的方法 # bash -x xx.sh 就可以调试了 . -1. 配置 secureCRT 的设 ...

  9. Linux下打包压缩war、解压war包和jar命令

    情景:把project_a文件夹下的文件打包成project.war 1. 打包 jar -cvf project.war /project_a 说明: -c 创建war包 -v 显示过程信息 -f ...

  10. Analysis of Algorithms

    算法分析 Introduction 有各种原因要求我们分析算法,像预测算法性能,比较不同算法优劣等,其中很实际的一条原因是为了避免性能错误,要对自己算法的性能有个概念. 科学方法(scientific ...