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

一:分组汇总

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. 【趣事】用 JavaScript 对抗 DDOS 攻击 (下)

    上一篇:http://www.cnblogs.com/index-html/p/js-network-firewall.html 对抗 v2 之前的那些奇技淫巧,纯属娱乐而已,并不能撑多久. 但简单. ...

  2. OpenSceneGraph in ActiveX by ActiveQt

    OpenSceneGraph in ActiveX by ActiveQt eryar@163.com Abstract. Qt’s ActiveX and COM support allows Qt ...

  3. 转:聊聊mavenCenter和JCenter

    Gradle支持从maven中央仓库和JCenter上获取构件,那这两者有什么区别呢? maven中央仓库(http://repo1.maven.org/maven2/)是由Sonatype公司提供的 ...

  4. WebApi - 路由

    这段时间的博客打算和大家一起分享下webapi的使用和心得,主要原因是群里面有朋友说希望能有这方面的文章分享,随便自己也再回顾下:后面将会和大家分不同篇章来分享交流心得,希望各位多多扫码支持和点赞,谢 ...

  5. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  6. 破解SQLServer for Linux预览版的3.5GB内存限制 (UBUNTU篇)

    在上一篇中我提到了如何破解RHEL上SQLServer的内存大小限制,但是Ubuntu上还有一道检查 这篇我将会讲解如何在3.5GB以下内存的Ubuntu中安装和运行SQLServer for Lin ...

  7. 【云知道】究极秒杀Loadrunner乱码

    Loadrunner乱码一击必杀 之前有介绍一些简单的针对Loadrunner脚本或者调试输出内容中乱码的一些设置,但是并没能完全解决一些小伙伴的问题,因为那些设置实在能力有限,还是有很多做不到的事情 ...

  8. 在DevExpress程序中使用GridView直接录入数据的时候,增加列表选择的功能

    在我上篇随笔<在DevExpress程序中使用Winform分页控件直接录入数据并保存>中介绍了在GridView以及在其封装的分页控件上做数据的直接录入的处理,介绍情况下数据的保存和校验 ...

  9. HttpPost过程中使用的URLEncoder.encode(something, encode)

    URLEncoder.encode("刘美美", "utf-8").toString()       =     %E5%88%98%E7%BE%8E%E7%B ...

  10. SQL SERVER导入数据到ORACLE的方法总结

    我们偶尔会有将数据从SQL SERVER导入到ORACLE当中的这种需求,那么这种跨数据库导数有那些方法呢?这些方法又有那些利弊呢? 下面比较肤浅的总结了一些可行的方法. 1:生成SQL脚本然后去OR ...