MongoDB分组汇总操作,及Spring data mongo的实现
转载请在页首注明作者与出处
一:分组汇总
1.1:SQL样例
分组汇总的应用场景非常多,比如查询每个班级的总分是多少,如果用关系形数据库,那么sql是这样子的
SELECT count(1),class from score group by class
得到的结果就是每个班分别的总分是多少,那么在mongodb这种非关系数据库要怎么做呢?
1.2:数据样例
假如我们有如下数据若干
{
"_id" : "4fe31003-0ee3-47b8-8a1d-0e9f8561c37e",
"systemId" : "test",
"bizId" : "test",
"channel" : "通道一",
"msg" : "你好!",
"createTime" : ISODate("2016-10-25T09:17:12.228+0000"),
"useTime" : NumberLong(274),
"success" : NumberInt(1)
}
{
"_id" : "4fe31003-0ee3-47b8-8a1d-0e9f8561c37e",
"systemId" : "test",
"bizId" : "test",
"channel" : "通道二",
"msg" : "你好!",
"createTime" : ISODate("2016-10-25T09:17:12.228+0000"),
"useTime" : NumberLong(274),
"success" : NumberInt(1)
}
1.3:需求
如上短信的发送记录,我们可能统计不同短信通道channnel的发送数量。
1.4:mongodb查询语法
db.shortMessageLog.aggregate([{$group : {_id : "$channel" , num : {$sum : 1}}}]);
这意味着对channel进行分组,并且查询出来的分组名称以id的形式显示出来
查询结果如下:
{
"_id" : "通道一",
"num" : NumberInt(12504)
}
{
"_id" : "通道二",
"num" : NumberInt(594)
}
1.5:汇总时加入查询条件
这又是一个新的需求,我们可能只想统计一定时间的内的数量,所以我们需要加入查询条件。
新的语句如下
db.shortMessageLog.aggregate([{$match:{createTime:{$gte:new Date(2016,9,28)}}},{$group : {_id : "$channel" , num : {$sum : 1}}}]);
这里使用$match来匹配指定时间的数量。
小提示:mongodb的月份是从0开始的,也就是上面参数中的9,其实代码的是10月份。
我这里匹配时间大于2016-10-28号以后的数据,然后再交给后面的条件去分组。
1.6:使用java代码的实现
我们这里使用spring data mongo,相比原生的mongo驱动,这个确实要好用很多。
实现的需求就是根据时间来分组统计数量
Aggregation agg = null;
Criteria createTime = Criteria.where("createTime");
boolean timeTag = false;
if(startTime != null){
createTime.gte(startTime);
timeTag = true;
}
if(endTime != null){
createTime.lte(endTime);
timeTag = true;
}
GroupOperation groupOperation = Aggregation.group("channel").count().as("count");
if(timeTag){
agg = Aggregation.newAggregation(ShortMessageLog.class,Aggregation.match(createTime),groupOperation);
}else{
agg = Aggregation.newAggregation(ShortMessageLog.class, groupOperation);
}
AggregationResults<Map> results = mongoTemplate.aggregate(agg,ShortMessageLog.class,Map.class);
MongoDB分组汇总操作,及Spring data mongo的实现的更多相关文章
- spring data mongo API learn(转)
显示操作mongo的语句,log4j里面加入: log4j.logger.org.springframework.data.mongodb.core=DEBUG, mongodb log4j.appe ...
- Spring Data MongoDB 一:入门篇(环境搭建、简单的CRUD操作)
一.简介 Spring Data MongoDB 项目提供与MongoDB文档数据库的集成.Spring Data MongoDB POJO的关键功能区域为中心的模型与MongoDB的DBColle ...
- mongo学习使用记录2 spring data
spring data mongo 打印mongo NoSql语句 log4j.properties log4j.rootLogger=INFO, stdout log4j.logger.org.sp ...
- MongoDB和Java(6):Spring Data整合MongoDB副本集、分片集群
最近花了一些时间学习了下MongoDB数据库,感觉还是比较全面系统的,涉及了软件安装.客户端操作.安全认证.副本集和分布式集群搭建,以及使用Spring Data连接MongoDB进行数据操作,收获很 ...
- Spring Boot使用Spring Data Jpa对MySQL数据库进行CRUD操作
只需两步!Eclipse+Maven快速构建第一个Spring Boot项目 构建了第一个Spring Boot项目. Spring Boot连接MySQL数据库 连接了MySQL数据库. 本文在之前 ...
- SpringBoot入门:Spring Data JPA 和 JPA(理论)
参考链接: Spring Data JPA - Reference Documentation Spring Data JPA--参考文档 中文版 纯洁的微笑:http://www.ityouknow ...
- 解决neo4j @Transactional 与Spring data jpa @Transactional 冲突问题,@CreatedBy,@CreatedDate,@LastModifiedBy,@LastModifiedDate,以及解决@Version失效问题
之前mybatis特别流行,所以前几个项目都是用@SelectProvider,@InsertProvider,@UpdateProvider,@DeleteProvider 加反射泛型封装了一些通用 ...
- 学习Spring Data JPA
简介 Spring Data 是spring的一个子项目,在官网上是这样解释的: Spring Data 是为数据访问提供一种熟悉且一致的基于Spring的编程模型,同时仍然保留底层数据存储的特殊 ...
- Spring Data之Example<>
简单CRUD之Example动态查询 简单介绍 (部分口水话,部分来自网络,代码永远自产) 使用过Spring全家桶的各位大佬应该都知道,Spring Data这个是Spring对持久层框架的封装,比 ...
随机推荐
- Socket聊天程序——客户端
写在前面: 上周末抽点时间把自己写的一个简单Socket聊天程序的初始设计和服务端细化设计记录了一下,周二终于等来毕业前考的软考证书,然后接下来就是在加班的日子度过了,今天正好周五,打算把客户端的详细 ...
- React的使用与JSX的转换
前置技能:Chrome浏览器 一.拿糖:React的使用 React v0.14 RC 发布,主要更新项目: 两个包: React 和 React DOM DOM node refs 无状态的功能 ...
- lua执行字节码的过程介绍
前面一篇文章中介绍了lua给下面代码生成最终的字节码的整个过程,这次我们来看看lua vm执行这些字节码的过程. foo = "bar" local a, b = "a& ...
- 在Ubuntu 16.10安装mysql workbench报未安装软件包 libpng12-0错误
1.安装mysql workbench,提示未安装软件包 libpng12-0 下载了MySQL Workbench 6.3.8 在安装的时候报错: -1ubu1604-amd64.deb 提示: ...
- React Native Android gradle下载慢问题解决
很多人会遇到 初次运行 react-native run android的时候 gradle下载极慢,甚至会失败的问题 如下图 实际上这个问题好解决的 首先 把对应版本的gradle下载到本地任意一个 ...
- Mysql 忘记root密码处理办法
一.更改my.cnf配置文件 1.用命令编辑/etc/my.cnf配置文件,即:vim /etc/my.cnf 或者 vi /etc/my.cnf 2.在[mysqld]下添加skip-grant-t ...
- Linux硬件IO的优化简介
Linux硬件IO的优化简介 首先简单介绍下有哪些硬件设备如下(由于硬件种类厂家等各种因素我就不在此多做介绍有兴趣的可以自行学习): 1.CPU:中央处理器,是计算机运算控制的核心部件之一,相当于人的 ...
- Ubuntu1604下安装Liggghts及CFDEM Coupling
部分内容参考http://www.linuxdiyf.com/linux/16315.html LIGGGHTS是一款开源的DEM软件,来自于著名的分子动力学软件LAMMPS,目前借助于CFDEM C ...
- swift 可选类型(optional)--- swift 入门
一.思维导图 二.代码 //这样无形中就会让代码很丑陋 if x != nil && y != nil { print("x或y都不等于空") } print(&q ...
- VS2010 release编译下进行调试,“当前不会命中任何断点,还没有为文档加载”问题解决方案
在release模式下调试程序,经常出现"当前不会命中任何断点,还没有为文档加载"的问题,可尝试以下方法: 1. 属性 → 配置属性 → C/C++ → 常规 → 调试信息格式:选 ...