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}]

 

 

 

 

 

 

 

 

 

 

<think>好的,我现在需要回答用户关于Spring Boot和MongoDB的问题。首先,我得回忆一下这两个技术的基本概念以及它们如何结合使用。 首先,Spring Boot是一个用于简化Spring应用程序开发的框架,它提供了自动配置和快速启动的能力。而MongoDB是一个NoSQL数据库,使用文档存储结构,适合处理非结构化数据。用户可能想知道如何在Spring Boot中集成MongoDB,以及相关的配置和操作步骤。 接下来,我需要考虑用户可能的疑问点。比如,如何配置MongoDB连接,如何进行基本的CRUD操作,以及可能遇到的常见问题。同时,用户可能希望了解MongoDB与传统关系型数据库的区别,以及使用Spring Boot带来的便利性。 然后,我需要组织回答的结构。通常,介绍部分应该先概述两者的概念,接着详细讲解集成步骤,然后给出代码示例,最后提到注意事项或最佳实践。确保每一步都清晰,并且使用用户容易理解的语言。 在技术细节方面,需要提到Spring Data MongoDB这个项目,它是Spring生态中用于支持MongoDB的模块。需要解释如何通过添加依赖(如Maven或Gradle配置),然后在application.properties或application.yml中配置数据库连接信息,比如主机、端口、数据库名称等。 关于CRUD操作,应该介绍如何使用MongoRepository接口,定义实体类以及如何编写Repository接口。代码示例需要符合规范,使用正确的注解,比如@Document对应实体类,@Id标注主键。同时,要确保示例中的语法正确,比如使用$符号包裹行内公式,但在这个问题中可能不需要数学公式,所以可能不需要涉及。不过需要检查是否有其他格式要求,比如用户提到的独立公式需要用$$...$$,但这里可能不适用。 另外,可能需要提到事务管理,但注意MongoDB在4.0以后支持事务,但默认情况下可能需要配置。还要注意版本兼容性问题,不同版本的Spring Boot可能对应不同的MongoDB驱动版本,需要确保兼容。 可能还需要比较MongoDB和传统关系型数据库的优势,比如灵活的模式设计、水平扩展能力,适合大数据量和高并发的场景。同时,也要提到其局限性,比如不支持JOIN操作,事务处理相对复杂等。 最后,总结一下使用Spring Boot整合MongoDB的好处,比如快速开发、自动配置、丰富的Spring Data特性,以及社区支持等。可能还要给出一些学习资源或进一步阅读的建议,帮助用户深入理解。 现在,我需要检查是否有遗漏的部分,比如配置中的用户名密码,SSL连接,或者使用MongoTemplate进行更复杂的查询。此外,是否需要提到聚合框架或者索引的创建?用户的问题比较宽泛,可能不需要太深入,但简要提及高级特性可以作为扩展内容。 确保回答符合用户给出的格式要求:使用中文,行内公式用$...$,独立公式用$$...$$,但在这个问题中可能不需要数学公式,所以主要注意代码块和配置示例的正确格式。同时结构要清晰,分步骤说明,语言简洁明了。</think>以下是关于Spring Boot与MongoDB集成的详细介绍,分步骤说明其核心概念与使用方法: --- ### 一、Spring Boot与MongoDB概述 1. **Spring Boot** 是简化Spring应用开发的框架,通过**自动配置**和**起步依赖**快速构建独立、生产级应用。 特点:内嵌服务器、简化配置、监控支持。 2. **MongoDB** 是**NoSQL文档数据库**,以BSON(类JSON)格式存储数据,支持动态模式、水平扩展和高性能查询。 适用场景:大数据、实时分析、内容管理系统等非结构化数据场景。 --- ### 二、Spring Boot集成MongoDB步骤 #### 1. 添加依赖 在`pom.xml`中引入Spring Data MongoDB: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> ``` #### 2. 配置连接信息 在`application.properties`中配置MongoDB连接: ```properties spring.data.mongodb.host=localhost spring.data.mongodb.port=27017 spring.data.mongodb.database=mydb # 若需认证 spring.data.mongodb.username=user spring.data.mongodb.password=pass ``` #### 3. 定义实体类 使用`@Document`注解映射集合: ```java @Document(collection = "users") public class User { @Id private String id; private String name; private Integer age; // Getter/Setter省略 } ``` #### 4. 创建Repository接口 继承`MongoRepository`实现CRUD: ```java public interface UserRepository extends MongoRepository<User, String> { List<User> findByName(String name); // 自定义查询方法 } ``` #### 5. 编写业务逻辑 在Service中注入Repository: ```java @Service public class UserService { @Autowired private UserRepository userRepository; public User createUser(User user) { return userRepository.save(user); } public List<User> findByName(String name) { return userRepository.findByName(name); } } ``` --- ### 三、核心操作示例 #### 1. 插入数据 ```java User user = new User(); user.setName("Alice"); user.setAge(30); userRepository.save(user); // 插入到"users"集合 ``` #### 2. 查询数据 ```java // 查询所有用户 List<User> users = userRepository.findAll(); // 根据名称查询(自定义方法) List<User> result = userRepository.findByName("Alice"); ``` #### 3. 复杂查询 使用`MongoTemplate`实现条件查询: ```java @Autowired private MongoTemplate mongoTemplate; public List<User> findUsersByAgeGreaterThan(int age) { Query query = new Query(); query.addCriteria(Criteria.where("age").gt(age)); return mongoTemplate.find(query, User.class); } ``` --- ### 四、高级特性 1. **索引管理** 在实体类字段添加`@Indexed`注解自动创建索引: ```java @Document(collection = "users") public class User { @Indexed(unique = true) private String email; } ``` 2. **聚合查询** 使用`Aggregation`处理数据分析: ```java Aggregation agg = Aggregation.newAggregation( Aggregation.group("name").count().as("total") ); mongoTemplate.aggregate(agg, "users", Map.class); ``` 3. **事务支持**(需MongoDB 4.0+) 在配置类启用事务: ```java @Configuration @EnableMongoRepositories @EnableTransactionManagement // 启用事务 public class MongoConfig { ... } ``` --- ### 五、注意事项 1. **版本兼容性** Spring Boot版本需与MongoDB驱动兼容,例如Spring Boot 2.x对应MongoDB 4.x。 2. **连接池配置** 调整连接池参数优化性能: ```properties spring.data.mongodb.uri=mongodb://user:pass@host:port/db?maxPoolSize=50 ``` 3. **数据模型设计** - 避免嵌套过深,影响查询性能。 - 合理使用索引,避免全集合扫描。 --- ### 六、总结 **Spring Boot + MongoDB的优势**: - 快速开发:自动配置减少样板代码。 - 灵活扩展:适应数据结构变化和业务增长。 - 生态丰富:Spring Data提供Repository、查询DSL等高级功能。 **适用场景**:实时分析、日志管理、物联网数据存储等需要高吞吐量和灵活模式的场景。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

万米高空

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

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

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

打赏作者

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

抵扣说明:

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

余额充值