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、结语

由于网上在这方面的代码比较少,所以我写一篇开源文档帮助这方面需要的人。其它的比如求和、求均值或者模糊查询,网上都有,而且很全,我就不献丑了。
最后,因为保密原因,我删减了很多,如果遇到问题,欢迎评论区留言,我都会解答的。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐