MongoDB之通过mongoTemplate利用aggregate管道聚合操作获取某一个或多个字段的最大值和最小值
有时候在操作mongodb数据库时需要找出某个字段的最大值和最小值,网上的方法就两种,一种是先排序,按升序或者按降序,然后取第一个值就可以得到最大值或最小值了,听起来很美好,但一旦数据库内数据非常多的时候,而且还是mongoDB这样的数据库,如果查一遍库才能拿到值,代价是非常大的。所以我主要采用第二种方法,也就是利用mongodbTemplate来进行管道操作来获取mongodb数据库中某一个或多
·
1、问题场景
有时候在操作mongodb数据库时需要找出某个字段的最大值和最小值,网上的方法就两种,一种是先排序,按升序或者按降序,然后取第一个值就可以得到最大值或最小值了,听起来很美好,但一旦数据库内数据非常多的时候,而且还是mongoDB这样的数据库,如果查一遍库才能拿到值,代价是非常大的。所以我主要采用第二种方法,也就是利用mongodbTemplate来进行管道操作来获取mongodb数据库中某一个或多个字段的最大值和最小值。
2、具体方法(管道聚合操作)
public List<Integer> findMaxFoodAndMinFood() {
// 排除数据为空或者为Null的情况
Criteria criteria = Criteria.where("food").ne(null).andOperator(Criteria.where("food").ne(""));
// 开始管道聚合操作
Aggregation aggregation = Aggregation.newAggregation(
// 先执行筛选
Aggregation.match(criteria),
// 按照id来分组(对应数据库里的id)
Aggregation.group("id")
// 找出food这个字段(对应数据库里的food)的最大值和最小值,并取个别名minFood和maxFood
.min("food").as("minFood")
.max("food").as("maxFood")
);
// 分别放入aggregation和 数据库里的集合名“food_t”,BasicDBObject类
AggregationResults<BasicDBObject> outputTypeCount = mongoTemplate.aggregate(aggregation, "food_t", BasicDBObject.class);
// 定义一个 DBObject对象
DBObject obj = new BasicDBObject();
// 循环赋值
for (Iterator<BasicDBObject> iterator = outputTypeCount.iterator(); iterator.hasNext(); ) {
obj = iterator.next();
}
// 获取别名为maxFood的值(也就是最大值)
Integer maxFood = (Integer) obj.get("maxFood");
// 获取别名为minFood的值(也就是最小值)
Integer minFood = (Integer) obj.get("minFood");
// 添加到List集合
List<Integer> foodList = new ArrayList<>();
foodList.add(minFood);
foodList.add(maxFood);
// 这样最大值和最小值都找到了,而且还能取值,并存到foodList集合里
return foodList;
}
根据以上步骤自己慢慢来,就可以了。
3、结语
由于网上在这方面的代码比较少,所以我写一篇开源文档帮助这方面需要的人。其它的比如求和、求均值或者模糊查询,网上都有,而且很全,我就不献丑了。
最后,因为保密原因,我删减了很多,如果遇到问题,欢迎评论区留言,我都会解答的。
更多推荐
已为社区贡献4条内容
所有评论(0)