最近在检索MongoDB的数据时需要用到分组操作,由于没有现成的说明文档可参考,只能是在代码中不断调试、摸索前进;目前已现实了Java对MongoDB的分组操作,并统计各个分组的数量。现通过示例详细解析,步骤如下流程所示:

(1)测试环境条件准备:MongoDB的版本为2.0.1,如下图所示

(2)测试数据源准备:MongoDB的数据源示例如下图所示

(3)测试示例过程:

  • 最初测试过程
1、示例代码
public void test(String guid) {
String groupKey = "sex"; // 按性别来分组
GroupBy groupBy = new GroupBy(groupKey);
final String COUNT = "count"; // 统计数量值的key,可以任意字符串,例如total
DBObject initial = new BasicDBObject();
initial.put(COUNT, 0); // 初始值为0
// reduce必须要定义,否则调用MongoDB的group方法时会抛出异常
String reduce = "function (document, output) { "
+ " output." + COUNT + "++; " // 统计数量值的key自增
+ "}";
// 可以不用定义finalize变量
String finalize = "function (output) {"
+ "return output;"
+ "}";
groupBy = groupBy.reduceFunction(reduce); // 必须要设置,不能为null,该函数的含义是在分组操作时定义一个操作文档的聚合函数
groupBy = groupBy.collation(null); // 设置为null吧
groupBy = groupBy.finalizeFunction(finalize); // 可以设置为null,该函数的含义是在group函数返回最终值之前,定义一个运行每个分组的结果集的函数
groupBy = groupBy.initialDocument(initial.toString()); // 初始化分组统计数量
String criteriaKey = "guid"; // 过滤的条件
String criteriaValue = guid; // 过滤值
Criteria criteria = Criteria.where(criteriaKey).is(criteriaValue);
String collectionName = "test_mongodb"; // MongoDB中数据集合名称
GroupByResults<Map> mapGroupByResults = mongoTemplate.group(criteria, collectionName, groupBy, Map.class);
logger.info(mapGroupByResults.toString());
}
变量groupBy的属性值如下所示:

从上图中可以看出代码设置的值是有具体的含义的,可以明白这些值在group()函数中作用。
2、示例结果

从上图中我们可以看出分组结果已出来了,根据guid为"2"的条件下按性别进行分组:男的有2人,女的也有2人。而guid为"2"的记录总共有count=4.0,即4人。
需要注意的地方是,count=4.0的count属性是GroupByResult自带的,跟代码中设置的final String COUNT="count"没有关联的,在下面的测试结果中会发现这种差别。
  • 修改测试过程
1、代码稍作修改
public void test(String guid) {
String groupKey = "sex";
GroupBy groupBy = new GroupBy(groupKey);
final String COUNT = "total"; // 修改为total
DBObject initial = new BasicDBObject();
initial.put(COUNT, 0);
String reduce = "function (document, output) { "
+ " output." + COUNT + "++; "
+ "}";
// String finalize = "function (output) {"
// + "return output;"
// + "}";
groupBy = groupBy.reduceFunction(reduce);
groupBy = groupBy.collation(null);
// groupBy = groupBy.finalizeFunction(finalize);
groupBy = groupBy.finalizeFunction(null);
groupBy = groupBy.initialDocument(initial.toString());
String criteriaKey = "guid";
String criteriaValue = guid;
Criteria criteria = Criteria.where(criteriaKey).is(criteriaValue);
String collectionName = "test_mongodb";
GroupByResults<Map> mapGroupByResults = mongoTemplate.group(criteria, collectionName, groupBy, Map.class);
logger.info(mapGroupByResults.toString());
}
变量groupBy的属性值如下所示:

从上图中可以看到细微的差别是:initial的value值由"{"count":0}”变为"{"total":0}",这是因为在代码中修改了COUNT的赋值;此外,finalize也被赋值为null了,说明它对结果不会有影响。
2、测试结果

测试结果跟第一种的测试结果是类似的,只不过是通过关键字total来代表统计数量值了。

------20191209闪

Java对MongoDB进行分组操作并统计各个分组的数量的更多相关文章

  1. java学习(三) java 中 mongodb的各种操作

    一. 常用查询: 1. 查询一条数据:(多用于保存时判断db中是否已有当前数据,这里 is  精确匹配,模糊匹配 使用 regex...) public PageUrl getByUrl(String ...

  2. MySQL数据库Group by分组之后再统计数目Count(*)与不分组直接统计数目的区别

    简述问题“统计最新时刻处于某一状态的设备的数量” 1. 首先子查询结果,可以看到每个设备最新的状态信息 2.1 在子查询的基础上,对设备状态进行分组,进行统计每个状态的设备数量 2.1.1 可以看到处 ...

  3. mongodb在java驱动包下的操作(转)

    推荐几章很有用的文章 java操作参考文档 http://www.cnblogs.com/hoojo/archive/2011/06/02/2068665.html http://blog.csdn. ...

  4. java 对mongodb的操作

    java 对mongodb的操作 1.1连单台mongodb Mongo mg = newMongo();//默认连本机127.0.0.1  端口为27017 Mongo mg = newMongo( ...

  5. springboot 学习之路 14(整合mongodb的Api操作)

    springboot整合mongodb: mongodb的安装和权限配置  请点击连接参考 mongodb集成 : 第一步:引如pom文件 第二步:配置文件配置mongodb路径: 第三步:关于mon ...

  6. MongoDB的聚合操作以及与Python的交互

    上一篇主要介绍了MongoDB的基本操作,包括创建.插入.保存.更新和查询等,链接为MongoDB基本操作. 在本文中主要介绍MongoDB的聚合以及与Python的交互. MongoDB聚合 什么是 ...

  7. mongodb group php 操作

    紧接着上篇来,这篇主要讲,mongodb的group功能,做的还是挺强大的,相当对于find(),skip(),distinct()等,用法比较复杂. 测试数据 > db.fruit.find( ...

  8. MongoDB的基本使用及java对MongoDB的基本增删改查

    MongoDB的特点 MongoDB 是文档存储数据库,存储结构灵活 MongoDB 支持复杂查询操作.支持序列 MongoDB 采用C++开发,可以做分布式扩展 MongoDB 采用BSON格式存储 ...

  9. MongoDB第三天(正则,管道,聚合,字符串,算术,日期,java连接MongoDB)

    部分正则表达式: i:忽略大小写 m:多行查找 x:设置 x 选项后,正则表达式中的非转义的空白字符将被忽略.   s:允许点字符(即.)匹配包括换行符在内的所有字符. w:匹配包括下划线的任何单词字 ...

随机推荐

  1. 杭电-------2045不容易系列之(3)—— LELE的RPG难题(C语言写)

    /* 当最后一个块可以和第一个块染相同颜色时,答案为:3*pow(2,n-1);但是最后一块不能和第一块颜色相同,则减去和第一 块颜色相同的染色种数即可 3*pow(2,n-1)-ranse(n-1) ...

  2. 将jsp页面转化为图片或pdf(一)(qq:1324981084)

    java高级架构师全套vip教学视频,需要的加我qq1324981084 在项目中遇见了将jsp页面转化为pdf的问题,试过itext,但是itext需要标准的html代码,我的页面中的一些属性是it ...

  3. Python3标准库:pprint美观打印数据结构

    1. pprint美观打印数据结构 pprint模块包含一个“美观打印机”,用于生成数据结构的一个美观的视图.格式化工具会生成数据结构的一些表示,不仅能够由解释器正确地解析,还便于人阅读.输出会尽可能 ...

  4. JS数组方法(ES5、ES6)

    1. arr.push() 从后面添加元素,添加一个或多个,返回值为添加完后的数组长度 let arr = [1,2,3,4,5] console.log(arr.push(6,7)) // 7 3 ...

  5. 如何使用 Vue-TCB 快速在 Vue 应用中接入云开发

    什么是 Vue TCB 我自己平时经常会用到 Vue 来开发前端应用.所以,基于 Vue 的插件系统,封装了一个 Vue 插件. 如何使用 1. 安装 vue-tcb 执行如下命令,安装 vue-tc ...

  6. sql查询 ——排序

    -- 排序 -- order by 排序 默认为升序 -- asc 升序 -- desc 降序 -- 查询身高 分别用升序和降序 select *from student order by high ...

  7. Scout YYF I POJ - 3744【矩阵乘法优化求概率】

    题意: 一条路上有 $n$ 个地雷,YYF 从位置 $1$ 出发,走一步的概率为 $p$,走两步的概率是 $(1-p)$.求 YYF 能顺利通过这条路的概率. 数据范围: $1\leq n \leq ...

  8. Android_小账本_筛选功能的实现

    昨天对小账本的相关功能做了完善,新增了筛选功能. 支持对类型.收支项.日期进行修改. 但暂时尚不完善,只能针对相关小项进行筛选,无法连续对小项的结果进行筛选.这一功能预计在本周三进行完善. 相关代码 ...

  9. linux 多并发 连接限制修改

    1. 修改 ulimit -a 查看 open files 表示单个用户能打开的最大句柄  如果开发的高并发当个进程打开的句柄需要很大. 修改/etc/security/limits.conf 里面有 ...

  10. 44.Python实现简易的图书管理系统

    首先展示一下图书管理系统的首页: 这是图书管理系统的发布图书页面: 最后是图书管理系统的图书详情页已经图书进行删除的管理页. 该图书管理系统为练习阶段所做,能够实现图书详情的查询.图书的添加.图书的删 ...