MongoDB
MongoDB 是一种基于文档的NoSQL数据库,以其高性能、高可用性和易扩展性而著称。它使用 BSON(类似 JSON 的二进制格式)来存储数据,提供了灵活的数据模型,使得开发者可以更轻松地存储和查询复杂的数据结构。将MongoDB与Spring Boot应用程序整合可以大大增强应用程序的数据处理能力。本指南将带你一步步完成如何通过Docker或Flapdoodle嵌入式MongoDB库来设置MongoDB与Spring Boot的整合。
MongoDB: The Developer Data Platform | MongoDB
MongoDB 教程 | 菜鸟教程 (runoob.com)
MongoDB 的主要特点
- 文档存储:MongoDB 使用文档(Document)作为数据的基本存储单位。一个文档是一个键值对的集合,类似于 JSON 对象。这种存储方式使得数据的表示更加直观和灵活。
- 灵活的数据模型:与传统的关系型数据库不同,MongoDB 允许在一个集合(Collection)中存储具有不同结构的文档。这种灵活性使得应用程序能够更快速地适应变化。
- 高性能:MongoDB 提供高效的查询性能和写入速度,能够处理大量的数据和高并发的操作。
- 高可用性和自动分片:MongoDB 支持复制集(Replica Set)和分片(Sharding),从而实现数据的高可用性和水平扩展。复制集提供了数据的冗余和故障切换能力,而分片允许将数据分布在多个服务器上以实现负载均衡。
- 丰富的查询语言:MongoDB 提供了强大的查询语言,可以通过条件、排序、聚合等多种方式来查询和操作数据。还支持全文搜索、地理空间查询等高级功能。
- 事务支持:从 MongoDB 4.0 开始,支持多文档 ACID 事务,使得开发者可以在多个文档之间进行原子性操作。
使用场景
- 内容管理系统:灵活的数据模型使得 MongoDB 能够轻松存储和管理不同类型的内容。
- 实时分析:高性能和丰富的查询功能使得 MongoDB 成为实时数据分析和处理的理想选择。
- 物联网(IoT)应用:可以高效地处理来自各种设备的大量数据。
- 移动应用和游戏:能够处理高并发的用户请求,并提供快速的响应时间。
SpringBoot + MongoDB
添加MongoDB依赖
首先,你需要在pom.xml
文件中添加MongoDB相关的依赖。
1 2 3 4 5 6
| <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> </dependencies>
|
使用Docker启动MongoDB
如果你选择使用Docker启动MongoDB,可以按照以下步骤进行操作:
- 确保已安装Docker。
- 使用以下命令启动MongoDB容器:
1
| docker run -p 27017:27017 -d mongo:latest
|
配置文件
在Spring Boot的application.yml
文件中配置MongoDB连接:
1 2 3 4 5 6
| spring: data: mongodb: host: localhost port: 27017 database: test
|
示例
与 初识Apache Cassandra:从基础到实践 中的代码基本相同,可跳转至文章阅读第五节。
实体类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| package org.mongodbdemo.pojo;
import lombok.AllArgsConstructor; import lombok.Data; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document;
@Data @Document @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PRIVATE, force = true) public class User { @Id private String id; private String name; private String email; }
|
存储库接口
1 2 3 4 5 6 7 8
| package org.mongodbdemo.repo;
import org.mongodbdemo.pojo.User; import org.springframework.data.repository.CrudRepository;
public interface UserRepo extends CrudRepository<User, String>{ }
|
服务类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| package org.mongodbdemo.service; import org.mongodbdemo.pojo.User; import org.mongodbdemo.repo.UserRepo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Optional;
@Service public class UserService {
@Autowired private UserRepo userRepo;
public User saveUser(User user) { return userRepo.save(user); }
public Optional<User> getUserById(String id) { return userRepo.findById(id); }
public Iterable<User> getAllUsers() { return userRepo.findAll(); }
public void deleteUserById(String id) { userRepo.deleteById(id); } }
|
控制类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| package org.mongodbdemo.controller;
import org.mongodbdemo.pojo.User; import org.mongodbdemo.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*;
import java.util.Optional;
@RestController @RequestMapping("/users") public class UserController {
@Autowired private UserService userService;
@PostMapping public User createUser(@RequestBody User user) { return userService.saveUser(user); }
@GetMapping("/{id}") public Optional<User> getUser(@PathVariable String id) { return userService.getUserById(id); }
@GetMapping public Iterable<User> getAllUsers() { return userService.getAllUsers(); }
@DeleteMapping("/{id}") public void deleteUser(@PathVariable String id) { userService.deleteUserById(id); } }
|
测试结果
增加
查询
删除