转载请在页首注明作者与出处

一:分组汇总

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的实现的更多相关文章

  1. spring data mongo API learn(转)

    显示操作mongo的语句,log4j里面加入: log4j.logger.org.springframework.data.mongodb.core=DEBUG, mongodb log4j.appe ...

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

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

  3. mongo学习使用记录2 spring data

    spring data mongo 打印mongo NoSql语句 log4j.properties log4j.rootLogger=INFO, stdout log4j.logger.org.sp ...

  4. MongoDB和Java(6):Spring Data整合MongoDB副本集、分片集群

    最近花了一些时间学习了下MongoDB数据库,感觉还是比较全面系统的,涉及了软件安装.客户端操作.安全认证.副本集和分布式集群搭建,以及使用Spring Data连接MongoDB进行数据操作,收获很 ...

  5. Spring Boot使用Spring Data Jpa对MySQL数据库进行CRUD操作

    只需两步!Eclipse+Maven快速构建第一个Spring Boot项目 构建了第一个Spring Boot项目. Spring Boot连接MySQL数据库 连接了MySQL数据库. 本文在之前 ...

  6. SpringBoot入门:Spring Data JPA 和 JPA(理论)

    参考链接: Spring Data JPA - Reference Documentation Spring Data JPA--参考文档 中文版 纯洁的微笑:http://www.ityouknow ...

  7. 解决neo4j @Transactional 与Spring data jpa @Transactional 冲突问题,@CreatedBy,@CreatedDate,@LastModifiedBy,@LastModifiedDate,以及解决@Version失效问题

    之前mybatis特别流行,所以前几个项目都是用@SelectProvider,@InsertProvider,@UpdateProvider,@DeleteProvider 加反射泛型封装了一些通用 ...

  8. 学习Spring Data JPA

    简介 Spring Data 是spring的一个子项目,在官网上是这样解释的: Spring Data 是为数据访问提供一种熟悉且一致的基于Spring的编程模型,同时仍然保留底层数据存储的特​​殊 ...

  9. Spring Data之Example<>

    简单CRUD之Example动态查询 简单介绍 (部分口水话,部分来自网络,代码永远自产) 使用过Spring全家桶的各位大佬应该都知道,Spring Data这个是Spring对持久层框架的封装,比 ...

随机推荐

  1. 使用 .NET WinForm 开发所见即所得的 IDE 开发环境,实现不写代码直接生成应用程序

    直接切入正题,这是我09年到11年左右业余时间编写的项目,最初的想法很简单,做一个能拖拖拽拽就直接生成应用程序的工具,不用写代码,把能想到的业务操作全部封装起来,通过配置的方式把这些业务操作组织起来运 ...

  2. JavaScript权威指南 - 数组

    JavaScript数组是一种特殊类型的对象. JavaScript数组元素可以为任意类型,最大容纳232-1个元素. JavaScript数组是动态的,有新元素添加时,自动更新length属性. J ...

  3. ASP.NET Core应用针对静态文件请求的处理[5]: DefaultFilesMiddleware中间件如何显示默认页面

    DefaultFilesMiddleware中间件的目的在于将目标目录下的默认文件作为响应内容.我们知道,如果直接请求的就是这个默认文件,那么前面介绍的StaticFileMiddleware中间件会 ...

  4. 一个诡异的COOKIE问题

    今天下午,发现本地的测试环境突然跑不动了,thinkphp直接跑到异常页面,按照正常的排错思路,直接看thinkphp的log 有一条 [ error ] [2]setcookie() expects ...

  5. javascript之闭包理解以及应用场景

    半个月没写博文了,最近一直在弄小程序,感觉也没啥好写的. 之前读了js权威指南,也写了篇博文,但是实话实说当初看闭包确实还是一头雾水.现在时隔一个多月(当然这一段时间还是一直有在看闭包的相关知识)理解 ...

  6. javaScript中的小细节-script标签中的预解析

    首先介绍预解析,虽然预解析字面意思很好理解,但是却是出坑出的最多的地方,也是bug经常会有的地方,利用好预解析的特性可以解决很多问题,并且提高代码的质量及数量,浏览器在解析代码前会把变量的声明和函数( ...

  7. mysql删除重复记录语句的方法

    例如: id name value 1 a pp 2 a pp 3 b iii 4 b pp 5 b pp 6 c pp 7 c pp 8 c iii id是主键 要求得到这样的结果 id name ...

  8. REGEX例子

    作为REGEX的例子,代码9.3显示了一个给定的文件有多少行,具有给定的模式,通过命令行输入(注:有更有效率的方式来实现这个功能,如Unix下的grep命令,在这里只是给出了另一种方式).这个程序像下 ...

  9. 如何让我们的PHP在Jexus中跑起来

    最近一段时间,经常看到不少的朋友在问,应该怎么设置才能够让Jexus支持PHP.其实,Jexus在很早之前就已经是可以支持PHP,像Apache或Nginx一样充当PHP的Web服务器的.不过由于没有 ...

  10. Ubuntu(Linux) + mono + xsp4 + nginx +asp.net MVC3 部署

    折腾了一下,尝试用Linux,部署mvc3. 分别用过 centos 和 ubuntu ,用ubuntu是比较容易部署的. 操作步骤如下: 一.终端分别如下操作 sudo su ->输入密码 a ...