MongoDB 作为一款 NoSQL 数据库,以其灵活的文档模型、高性能和可扩展性,成为了众多互联网应用的首选。而 SpringBoot 作为 Java 开发领域的明星框架,则以其简洁易用、快速开发的特点,为开发者提供了强大的支持。
今天,我们就来学习如何将 SpringBoot 与 MongoDB 结合使用。
入门篇:快速上手 MongoDB
安装 MongoDB
首先,我们需要安装 MongoDB。MongoDB 的安装非常简单,官方提供了各个平台的安装包,你只需要根据你的系统选择合适的安装包并按照步骤进行安装即可。
需要注意的是,在选择 Spring Data MongoDB 版本时,你需要确保其与你的 Spring Boot 版本兼容。可以参考 Spring Data MongoDB 的官方文档来查看兼容性表: https://docs.spring.io/spring-data/mongodb/reference/preface.html
我使用的是 [email protected] + JDK17 安装的 [email protected]。
配置项目依赖
添加 spring-boot-starter-data-mongodb
依赖,它将为我们提供与 MongoDB 集成的功能。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
配置 MongoDB 连接
在 application.yml
文件中配置 MongoDB 连接信息,例如:
spring:
data:
mongodb:
uri: mongodb://localhost:27017/uyii
创建实体类
定义一个简单的实体类,例如 User
类,包含 name
和 age
属性:
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
@Data
@Document(collection = "users")
public class User {
@Id
private String id;
@Indexed(unique = true)
private String name;
private Integer age;
}
创建 Repos
itory 接口
使用 Repository 接口,并定义常用的 CRUD 操作方法:
package com.uyii.springbootmongo.repository;
import com.uyii.springbootmongo.model.User;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends MongoRepository<User, String> {
}
创建 Controller
使用 @RestController
注解标记 Controller 类,注入 Repository 接口,并编写 API 接口:
import com.uyii.springbootmongo.model.User;
import com.uyii.springbootmongo.repository.UserRepository;
import com.uyii.springbootmongo.vo.demoVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.aggregation.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.MongoTemplate;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserRepository userRepository;
@Autowired
private MongoTemplate mongoTemplate;
// 添加
@PostMapping
public User createUser(@RequestBody User user) {
return userRepository.save(user);
}
// 详细
@GetMapping("/{id}")
public User getUser(@PathVariable String id) {
return userRepository.findById(id).orElse(null);
}
// 删除
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable String id) {
userRepository.deleteById(id);
}
// 修改
@PutMapping("/{id}")
public User updateUser(@PathVariable String id, @RequestBody User user) {
User userFromDb = userRepository.findById(id).orElse(null);
if (userFromDb != null) {
userFromDb.setName(user.getName());
userFromDb.setAge(user.getAge());
return userRepository.save(userFromDb);
}
return null;
}
// 列表
@GetMapping
public Iterable<User> getAllUsers() {
return userRepository.findAll();
}
}
进阶篇
使用 MongoDB 的高级特性
索引
索引就像一本目录,帮助 MongoDB 快速找到你想要的数据。你可以使用 @Indexed
注解在实体类中定义索引,或者使用 MongoTemplate
创建索引。
import lombok.Data;
import org.springframework.data.mongodb.core.index.Indexed;
@Data
@Document(collection = "users")
public class User {
@Id
private String id;
@Indexed(unique = true)
private String name; // 定义唯一索引
private int age;
}
聚合操作
聚合操作可以对数据进行分组、统计、排序等操作,例如:
/**
* 查询年龄等于指定值的文档数量
*/
@GetMapping("/count-by-age")
public AggregationResults<demoVo> countByAge(@RequestParam int age) {
// 创建匹配操作,用于筛选年龄等于指定值的文档
MatchOperation match = Aggregation.match(Criteria.where("age").is(age));
// 创建分组操作,按年龄分组并计算每个年龄的文档数量
GroupOperation group = Aggregation.group("age").count().as("count");
// 创建投影操作,将分组后的结果中的计数值重命名为"count",并保留原始的"_id"字段(即年龄)
ProjectionOperation project = Aggregation.project("count").and("_id").as("age");
// 创建聚合管道,将匹配、分组和投影操作组合在一起
Aggregation aggregation = Aggregation.newAggregation(match, group, project);
// 使用MongoTemplate执行聚合操作,并将结果映射到demoVo类
return mongoTemplate.aggregate(aggregation, "users", demoVo.class);
}
事务
MongoDB 支持事务,你可以使用 MongoTransactionManager
进行事务管理,保证数据的一致性。
总结
SpringBoot 与 MongoDB 的结合,为开发者提供了强大的工具,可以快速构建高效、灵活的应用。希望这篇文章能够帮助你入门 MongoDB,并将其应用到你的项目中。