springdata-Mongodb

本文详细介绍如何使用MongoDB的聚合框架进行数据分组、计算总和、分页、模糊查询及字段选择等操作,通过具体示例展示了如何在Java中使用Spring Data MongoDB实现这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mongodb执行语句

执行语句对应的java实现如下(这里是用springdata,非DBobject):

1.分组算合

首先表数据是这样的

 {
        "_id" : ObjectId("5c46e839349d712004652ab4"),
        "ORG_CODE" : "436044",
        "DATE" : "2019-01-21",
        "ALL_CHECKED_NUM" : NumberLong(0),
        "WARNING_NUM" : NumberLong(0),
        "WARNING_NUM_BIG" : NumberLong(0),
        "WARNING_NUM_SMALL" : NumberLong(0),
        "WARNING_PERCENT" : "0",
        "LAST_STATISTICS_TIME" : "2019-01-22 23:59:00"
    }
    {
        "_id" : ObjectId("5c46e839349d712004652ab6"),
        "ORG_CODE" : "436044",
        "DATE" : "2019-01-22",
        "ALL_CHECKED_NUM" : NumberLong(0),
        "WARNING_NUM" : NumberLong(0),
        "WARNING_NUM_BIG" : NumberLong(0),
        "WARNING_NUM_SMALL" : NumberLong(0),
        "WARNING_PERCENT" : "0",
        "LAST_STATISTICS_TIME" : "2019-01-23 10:34:00"
    }

要求:根据org_code分组,算ALL_CHECKED_NUM,WARNING_NUM,WARNING_NUM_BIG,WARNING_NUM_SMALL各自的总和

db.t_statistics_checked_info.aggregate([{$match:{DATE:{$gte:"2019-01-20",$lte:"2019-02-19"}}},{$group:{_id:"$ORG_CODE",ALL_CHECKED_NUM:{$sum:"$ALL_CHECKED_NUM"},WARNING_NUM:{$sum:"$WARNING_NUM"},WARNING_NUM_BIG:{$sum:"$WARNING_NUM_BIG"},WARNING_NUM_SMALL:{$sum:"$WARNING_NUM_SMALL"}}}])

java代码怎么写呢。。

public List<CheckedInfoStatistics>  querySumByOrg(Map<String, Object> params){
        List<AggregationOperation> operations = new ArrayList<>();
        if(params != null && params.size()>0){
            if (StringUtils.isNotNull(String.valueOf(params.get("ORG_CODE")))) {
                List<String> orgCodes = Arrays.asList(params.get("ORG_CODE").toString().split(","));
                operations.add(Aggregation.match(Criteria.where("ORG_CODE").in(orgCodes)));
            }
            if(StringUtils.isNotNull(String.valueOf(params.get("startTime")))
                    && StringUtils.isNotNull(String.valueOf(params.get("endTime")))){
                operations.add(Aggregation.match(Criteria.where("DATE").gte(params.get("startTime")).lte(params.get("endTime"))));
            }
        }
        operations.add(Aggregation.group("ORG_CODE")
                .sum("ALL_CHECKED_NUM").as("ALL_CHECKED_NUM")
                .sum("WARNING_NUM").as("WARNING_NUM")
                .sum("WARNING_NUM_BIG").as("WARNING_NUM_BIG")
                .sum("WARNING_NUM_SMALL").as("WARNING_NUM_SMALL"));

        Aggregation aggregation = Aggregation.newAggregation(operations);
        AggregationResults<CheckedInfoStatistics> resultCount = mongoTemplate.aggregate(aggregation,"t_statistics_checked_info",CheckedInfoStatistics.class);
        List<CheckedInfoStatistics> list = resultCount.getMappedResults();
        return list;
    }

CheckedInfoStatistics是根据我需要的字段建的一个结果集类,字段名字要和你查出来的结果字段名字一样。

还要注意一点,Aggregation.add是有顺序的,写前面就先执行了。

2.根据CREATOR进行分组,并显示一个分组统计条件之外的一个字段,以下例子是ORG_CODE。

operations.add(Aggregation.group("CREATOR").count().as("collectSum").first("ORG_CODE").as("ORG_CODE"));

3.分页

  if(StringUtils.isNotNull(String.valueOf(params.get("page")))
                && StringUtils.isNotNull(String.valueOf(params.get("limit")))) {
            int page = Integer.valueOf(String.valueOf(params.get("page")));
            int limit = Integer.valueOf(String.valueOf(params.get("limit")));
            Aggregation.skip(page > 1 ? (page - 1) * page : 0L);
            Aggregation.limit(limit);
        }

4.模糊查询

operations.add(Aggregation.match(Criteria.where("CREATOR").regex(".*?" + params.get("CREATOR") + ".*")));

5.可以选择性的显示查询出来的字段

operations.add(Aggregation.project("CREATOR","collectSum","org"));

执行语句是:

"$project": {
                "CREATOR": "$_id.CREATOR",
                "collectSum": 1,
                "ORG_CODE": 1
            }

如果是-1,表示不显示

6.根据分组后的字段排序

operations.add(Aggregation.sort(Sort.Direction.DESC,"collectSum"));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值