• Java对MongoDB进行分组操作并统计各个分组的数量


      最近在检索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闪

  • 相关阅读:
    Spring视频学习笔记(一)
    枚举(enum)与类的静态成员(static)
    Java的继承模式
    HTML锁定Table中某一列
    Winform 中的KeyDown
    我的WebService入门
    获取键盘或鼠标多久没有对屏幕进行操作了
    从DB输出值到DataTable时,字段值为NULL时报错相关信息;
    Data层相关问题 & JS循环取值
    字符串String的trim()方法
  • 原文地址:https://www.cnblogs.com/bien94/p/12012992.html
Copyright © 2020-2023  润新知