springboot MongoTemplate 之Aggregation 实现常见操作

本文介绍了如何在SpringBoot中利用MongoTemplate的Aggregation功能进行复杂数据查询和处理。首先,需要配置MongoDB的连接信息并注入MongoTemplate。在实际应用中,要注意查询顺序,例如条件、排序和限制的顺序类似于MySQL。聚合操作中,可以实现条件查询、排序和分组统计。使用Aggregation.group()进行分组统计,并可以结合其他方法进行详细的数据分析。查询结果建议使用实体类封装,避免使用Map,并可以通过withOptions()设置内存限制。

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

很多复杂的查询都是从简单的部分组合的实现,续接昨天的通过Query查询后,今天接着补充聚合管道-Aggregation 进行数据查询,处理。相比较Query查询,Aggregation 再处理数据时会方便很多,也便于优化查询语句。

首先springboot引入mongodb的配置也是从引入pom依赖->配置文件中mongodb的连接信息配置->在具体service中注入MongoTemplate 。这些上一篇文章都已经有写,不在重复。

需要注意导包是这些:org.springframework.data.mongodb.core.**;

import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

下面直接上demo。我这都是在单元测试中写的。

1.聚合管道实现简单的条件,排序数据查询功能。

注意点:执行 顺序可以完全参考mysql的书写顺序。

mysql是先where语句,然后排序,然后limit。

mongodb一样。也是必须先是条件语句,然后limit和sort。条件语句必须放到第一位,不然查询的可能为空。然后就是limit,sort谁在前的含义是不一样的。是先截取数据,对截取的数据排序还是先排序,在截取数据。这个也要考虑好了。正常是先排序,在截取数据。

注意点:查询结果用实体类封装。最好不用Map ,withOptions()用来解除mongodb 查询数据默认占用最大内存的(默认100M).

import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
    

@Autowired
private MongoTemplate mongoTemplate;
@Autowired
private HomeworkMultimediaMapper homeworkMultimediaMapper;

@Test
public void test1() {
HomeworkMultimedia homeworkMultimedia = homeworkMultimediaMapper.selectByPrimaryKey(124L);
Criteria criteria = new Criteria();
        criteria.and("virtualClassId").is(homeworkMultimedia.getVirtualClassId()).and("classTypeId").is(homeworkMultimedia.getClassTypeId());
        Aggregation aggregation = Aggregation.newAggregation(
                Aggregation.match(criteria),
                Aggregation.sort(Sort.Direction.ASC,"createTime","contentType"),             
                Aggregation.limit(20)
        ).withOptions(Aggregation.newAggregationOptions().allowDiskUse(true).build());
        //withOptions()用来解除mongodb 查询数据默认占用最大内存的(默认100M).
AggregationResults homeworkMultimediaDetailDocuments = mongoTemplate.aggregate(aggregation, "homework_multimedia_detail", HomeworkMultimediaDetailDocument.class);
List mappedResults = homeworkMultimediaDetailDocuments.getMappedResults();
LOGGER.info("results:{}",JSONObject.toJSONString(mappedResults));
}

2.聚合管道实现分组统计功能

Aggregation.group() : 聚合函数,将某个字段或者某个数组作为分组统计的依据。单独的分组实际上没啥用,一般都是分组后接着做些具体的分组统计操作。

具体的常用分组后的方法如下:

分组查询的结果一般需要起别名,意味着字段不在查询封装的实体中,可以使用Map来接受值

查询顺序是match,group,limit。

    @Test
    public void test2() {
        Criteria criteria = new Criteria();
        criteria.and("virtualClassId").is(4832400134809422L);
        Aggregation aggregation = Aggregation.newAggregation(
                Aggregation.match(criteria),
                Aggregation.group("contentType").count().as("contentTypeCount"),
                Aggregation.limit(200)
        ).withOptions(Aggregation.newAggregationOptions().allowDiskUse(true).build());

        AggregationResults homeworkMultimediaDetailDocuments = mongoTemplate.aggregate(aggregation, "homework_multimedia_detail", Map.class);
        List mappedResults = homeworkMultimediaDetailDocuments.getMappedResults();
        LOGGER.info("results:{}",JSONObject.toJSONString(mappedResults));
    }

查询结果的数据结构是这样:results:[{"_id":1,"contentTypeCount":16},{"_id":2,"contentTypeCount":6},{"_id":3,"contentTypeCount":6}]

 

 

 

 

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万米高空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值