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⽅法时会抛出异常groupby分组
String reduce = "function (document, output) { "
+ " output." + COUNT + "++; "    // 统计数量值的key⾃增
+ "}";
// 可以不⽤定义finalize变量
String finalize = "function (output) {"
+ "return output;"
+ "}";
groupBy = duceFunction(reduce); // 必须要设置,不能为null,该函数的含义是在分组操作时定义⼀个操作⽂档的聚合函数
groupBy = llation(null); // 设置为null吧
groupBy = groupBy.finalizeFunction(finalize); // 可以设置为null,该函数的含义是在group函数返回最终值之前,定义⼀个运⾏每个分组的结果集的函数
groupBy = groupBy.String()); // 初始化分组统计数量
String criteriaKey = "guid"; // 过滤的条件
String criteriaValue = guid; // 过滤值
Criteria criteria = Criteria.where(criteriaKey).is(criteriaValue);
String collectionName = "test_mongodb";  // MongoDB中数据集合名称
GroupByResults<Map> mapGroupByResults = up(criteria, collectionName, groupBy, Map.class);
logger.String());
}
变量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 = duceFunction(reduce);
groupBy = llation(null);
//        groupBy = groupBy.finalizeFunction(finalize);
groupBy = groupBy.finalizeFunction(null);
groupBy = groupBy.String());
String criteriaKey = "guid";
String criteriaValue = guid;
Criteria criteria = Criteria.where(criteriaKey).is(criteriaValue);
String collectionName = "test_mongodb";
GroupByResults<Map> mapGroupByResults = up(criteria, collectionName, groupBy, Map.class);
logger.String());
}
变量groupBy的属性值如下所⽰:
从上图中可以看到细微的差别是:initial的value值由"{"count":0}”变为"{"total":0}",这是因为在代码中修改了COUNT的赋值;此外,finalize也被赋值为null了,说明它对结果不会有影响。
2、测试结果
测试结果跟第⼀种的测试结果是类似的,只不过是通过关键字total来代表统计数量值了。
------20191209闪

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。