1. SpringBoot与MongoDB集成概述
在当今的Java开发领域,SpringBoot已经成为构建企业级应用的首选框架。而MongoDB作为最流行的NoSQL数据库之一,以其灵活的文档模型和高扩展性赢得了广泛青睐。将两者结合使用,能够为开发者提供高效的数据存储和处理方案。
我曾在多个电商和物联网项目中采用这种技术组合,实测下来发现它特别适合处理快速增长的非结构化数据。与传统的JDBC+MySQL方案相比,MongoDB的集成过程更加简洁,SpringBoot的自动配置特性让整个过程几乎"开箱即用"。
2. 环境准备与依赖配置
2.1 开发环境要求
在开始集成前,需要确保开发环境满足以下基本要求:
- JDK 1.8或更高版本(推荐JDK 11)
- Maven 3.5+或Gradle 6.x+
- SpringBoot 2.5.x或更高版本
- MongoDB 4.0+社区版或企业版
提示:MongoDB的版本选择很重要,Spring Data MongoDB对不同版本的MongoDB有不同的兼容性要求。我在实际项目中遇到过版本不匹配导致的连接问题,建议参考Spring官方文档的兼容性矩阵。
2.2 添加Maven依赖
在pom.xml中添加以下核心依赖:
<dependencies> <!-- SpringBoot Starter for MongoDB --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <!-- 可选:如果需要使用MongoDB的GridFS功能 --> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-sync</artifactId> </dependency> </dependencies>对于Gradle项目,在build.gradle中添加:
dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-mongodb' // 可选GridFS支持 implementation 'org.mongodb:mongodb-driver-sync' }2.3 配置MongoDB连接
在application.properties中配置MongoDB连接信息:
# MongoDB基础配置 spring.data.mongodb.host=localhost spring.data.mongodb.port=27017 spring.data.mongodb.database=myapp_db # 认证配置(如有) spring.data.mongodb.username=admin spring.data.mongodb.password=secret spring.data.mongodb.authentication-database=admin # 连接池配置 spring.data.mongodb.uri=mongodb://admin:secret@localhost:27017/myapp_db?authSource=admin spring.data.mongodb.auto-index-creation=true或者使用YAML格式的application.yml:
spring: data: mongodb: host: localhost port: 27017 database: myapp_db username: admin password: "secret" authentication-database: admin uri: mongodb://admin:secret@localhost:27017/myapp_db?authSource=admin auto-index-creation: true注意:在实际生产环境中,建议使用加密方式存储密码,而不是明文配置。可以使用Spring Cloud Config或Vault等方案管理敏感信息。
3. 核心功能实现
3.1 实体类映射
MongoDB使用文档存储数据,Spring Data MongoDB通过注解将Java对象映射为MongoDB文档:
import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; @Document(collection = "products") public class Product { @Id private String id; @Field("product_name") private String name; private BigDecimal price; @Indexed private String category; private List<String> tags = new ArrayList<>(); private Date createdAt = new Date(); // 省略getter/setter和构造方法 }关键注解说明:
@Document: 指定MongoDB集合名称@Id: 标记主键字段@Field: 自定义字段映射名称@Indexed: 为字段创建索引
3.2 仓库接口定义
Spring Data MongoDB提供了强大的Repository支持:
import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.data.mongodb.repository.Query; public interface ProductRepository extends MongoRepository<Product, String> { // 方法名自动推导查询 List<Product> findByCategory(String category); List<Product> findByPriceBetween(BigDecimal min, BigDecimal max); // 自定义查询 @Query("{'name': {$regex: ?0, $options: 'i'}}") List<Product> findByNameLike(String namePattern); @Query(value = "{'category': ?0}", fields = "{'name': 1, 'price': 1}") List<Product> findProjectedByCategory(String category); }3.3 自定义MongoTemplate操作
对于复杂操作,可以直接使用MongoTemplate:
import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; @Service public class ProductService { private final MongoTemplate mongoTemplate; public ProductService(MongoTemplate mongoTemplate) { this.mongoTemplate = mongoTemplate; } public List<Product> findExpensiveProducts(BigDecimal minPrice) { Query query = new Query(Criteria.where("price").gt(minPrice)); return mongoTemplate.find(query, Product.class); } public long updateProductCategory(String productId, String newCategory) { Query query = new Query(Criteria.where("id").is(productId)); Update update = new Update().set("category", newCategory); return mongoTemplate.updateFirst(query, update, Product.class).getModifiedCount(); } public Product upsertProduct(Product product) { Query query = new Query(Criteria.where("id").is(product.getId())); Update update = new Update() .set("name", product.getName()) .set("price", product.getPrice()) .set("category", product.getCategory()) .set("tags", product.getTags()) .setOnInsert("createdAt", new Date()); return mongoTemplate.upsert(query, update, Product.class); } }4. 高级特性与优化
4.1 事务支持
从MongoDB 4.0开始支持多文档事务,Spring Data MongoDB也提供了相应支持:
@Service public class OrderService { private final MongoTemplate mongoTemplate; @Transactional public void placeOrder(Order order) { // 扣减库存 Query stockQuery = new Query(Criteria.where("productId").is(order.getProductId())); Update stockUpdate = new Update().inc("quantity", -order.getQuantity()); mongoTemplate.updateFirst(stockQuery, stockUpdate, Inventory.class); // 创建订单 mongoTemplate.insert(order); // 记录日志 mongoTemplate.insert(new OrderLog(order.getId(), "CREATED")); } }注意:要启用MongoDB事务,必须使用副本集部署,单机MongoDB实例不支持事务。
4.2 聚合框架
MongoDB的聚合框架非常强大,可以处理复杂的数据分析需求:
public List<CategoryStats> getCategoryStatistics() { Aggregation aggregation = Aggregation.newAggregation( Aggregation.group("category") .count().as("productCount") .avg("price").as("avgPrice") .sum("price").as("totalValue"), Aggregation.sort(Sort.Direction.DESC, "productCount") ); return mongoTemplate.aggregate(aggregation, "products", CategoryStats.class) .getMappedResults(); }4.3 索引优化
合理的索引设计对MongoDB性能至关重要:
@Configuration public class MongoConfig { @Bean public MongoTemplate mongoTemplate(MongoDatabaseFactory factory) { MongoTemplate template = new MongoTemplate(factory); // 确保索引存在 template.indexOps(Product.class).ensureIndex( new Index().on("name", Sort.Direction.ASC) .named("product_name_idx") ); template.indexOps(Product.class).ensureIndex( new CompoundIndexDefinition( new Document("category", 1) .append("price", 1) ).named("category_price_idx") ); return template; } }5. 常见问题与解决方案
5.1 连接问题排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 连接超时 | 网络不通/MongoDB服务未启动 | 检查MongoDB服务状态,测试网络连通性 |
| 认证失败 | 用户名/密码错误 | 验证凭据,检查认证数据库设置 |
| 连接数不足 | 连接池配置过小 | 调整spring.data.mongodb.uri中的连接池参数 |
5.2 性能优化建议
查询优化:
- 使用投影只返回需要的字段
- 避免全表扫描,确保查询使用索引
- 限制返回结果数量
索引策略:
- 为常用查询字段创建索引
- 考虑复合索引的顺序
- 定期分析慢查询并优化索引
批量操作:
- 使用批量插入代替单条插入
- 批量更新时使用BulkOperations
BulkOperations bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.ORDERED, Product.class); for (Product product : products) { Query query = new Query(Criteria.where("id").is(product.getId())); Update update = new Update() .set("price", product.getPrice()) .set("stock", product.getStock()); bulkOps.upsert(query, update); } BulkWriteResult result = bulkOps.execute();5.3 数据类型映射问题
MongoDB与Java类型之间的映射有时会出现问题,特别是日期和Decimal类型:
@Configuration public class MongoConfig { @Bean public MappingMongoConverter mappingMongoConverter( MongoDatabaseFactory factory, MongoMappingContext context) { DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory); MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, context); // 自定义转换器 converter.setCustomConversions(new MongoCustomConversions(Arrays.asList( new BigDecimalToDecimal128Converter(), new Decimal128ToBigDecimalConverter() ))); return converter; } }6. 测试与验证
6.1 单元测试配置
使用SpringBootTest进行集成测试:
@DataMongoTest @ExtendWith(SpringExtension.class) public class ProductRepositoryTest { @Autowired private ProductRepository productRepository; @Autowired private MongoTemplate mongoTemplate; @BeforeEach public void setup() { mongoTemplate.dropCollection(Product.class); Product p1 = new Product("1", "Laptop", new BigDecimal("999.99"), "Electronics"); Product p2 = new Product("2", "Smartphone", new BigDecimal("699.99"), "Electronics"); Product p3 = new Product("3", "Desk", new BigDecimal("199.99"), "Furniture"); productRepository.saveAll(Arrays.asList(p1, p2, p3)); } @Test public void testFindByCategory() { List<Product> electronics = productRepository.findByCategory("Electronics"); assertEquals(2, electronics.size()); } @Test public void testPriceRangeQuery() { List<Product> products = productRepository.findByPriceBetween( new BigDecimal("500"), new BigDecimal("1000")); assertEquals(2, products.size()); } }6.2 测试容器支持
对于更真实的测试环境,可以使用Testcontainers:
@Testcontainers @DataMongoTest public class ProductRepositoryWithContainerTest { @Container static MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:4.4"); @DynamicPropertySource static void setProperties(DynamicPropertyRegistry registry) { registry.add("spring.data.mongodb.uri", mongoDBContainer::getReplicaSetUrl); } // 测试方法与之前相同 }7. 生产环境最佳实践
7.1 连接池配置优化
在生产环境中,合理的连接池配置对性能至关重要:
spring: data: mongodb: uri: mongodb://user:pass@host1:27017,host2:27017,host3:27017/dbname? authSource=admin& replicaSet=rs0& readPreference=secondaryPreferred& retryWrites=true& w=majority& maxPoolSize=100& minPoolSize=20& maxIdleTimeMS=60000& waitQueueTimeoutMS=2000关键参数说明:
maxPoolSize: 最大连接数(根据应用负载调整)minPoolSize: 最小保持的连接数maxIdleTimeMS: 连接最大空闲时间waitQueueTimeoutMS: 获取连接的超时时间
7.2 监控与健康检查
SpringBoot Actuator提供了MongoDB健康检查端点:
management: endpoint: health: show-details: always endpoints: web: exposure: include: health,metrics自定义健康检查指标:
@Component public class MongoHealthIndicator extends AbstractHealthIndicator { private final MongoTemplate mongoTemplate; public MongoHealthIndicator(MongoTemplate mongoTemplate) { this.mongoTemplate = mongoTemplate; } @Override protected void doHealthCheck(Health.Builder builder) throws Exception { try { Document result = mongoTemplate.executeCommand("{ serverStatus: 1 }"); builder.up() .withDetail("version", result.getString("version")) .withDetail("uptime", result.getDouble("uptime")) .withDetail("connections", result.get("connections", Document.class)); } catch (Exception e) { builder.down(e); } } }7.3 分片集群配置
对于大规模应用,需要配置MongoDB分片集群:
spring: data: mongodb: uri: mongodb://user:pass@mongos1:27017,mongos2:27017/dbname? authSource=admin& readPreference=secondaryPreferred& retryReads=true& retryWrites=true& w=majority分片策略配置示例:
@Configuration public class ShardingConfig { @Bean public ShardKeyProvider shardKeyProvider() { return collectionName -> { if ("orders".equals(collectionName)) { return new ShardKey("{customerId: 1}"); } else if ("products".equals(collectionName)) { return new ShardKey("{category: 1, _id: 1}"); } return null; }; } }8. 实际项目经验分享
在多个生产项目中集成SpringBoot和MongoDB后,我总结了以下宝贵经验:
文档设计原则:
- 避免过度嵌套(一般不超过3层)
- 将频繁一起访问的数据放在同一文档中
- 对写多读少的字段考虑单独集合
性能调优技巧:
- 使用
explain()分析查询执行计划 - 监控慢查询日志(profile级别设置为1或2)
- 合理使用
$lookup替代应用层join
- 使用
迁移策略:
- 大型项目采用双写策略逐步迁移
- 使用变更数据捕获(CDC)保持数据同步
- 考虑使用MongoDB Connector for Kafka
备份与恢复:
- 定期执行
mongodump和mongorestore - 配置oplog实现时间点恢复
- 测试备份恢复流程(至少每季度一次)
- 定期执行
安全实践:
- 启用TLS加密连接
- 使用角色基于访问控制(RBAC)
- 定期轮换密钥和密码
// 安全连接示例配置 @Bean public MongoClientSettingsBuilderCustomizer mongoClientSettingsCustomizer() { return clientSettingsBuilder -> { String truststorePath = "/path/to/truststore.jks"; String truststorePassword = "changeit"; SSLContext sslContext; try { KeyStore trustStore = KeyStore.getInstance("JKS"); try (InputStream is = new FileInputStream(truststorePath)) { trustStore.load(is, truststorePassword.toCharArray()); } TrustManagerFactory trustManagerFactory = TrustManagerFactory .getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(trustStore); sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, trustManagerFactory.getTrustManagers(), null); } catch (Exception e) { throw new RuntimeException("Failed to setup SSL context", e); } clientSettingsBuilder .applyToSslSettings(ssl -> ssl .enabled(true) .context(sslContext) .invalidHostNameAllowed(true)); }; }9. 扩展功能集成
9.1 GridFS文件存储
MongoDB的GridFS非常适合存储大文件:
@Service public class FileStorageService { private final GridFsTemplate gridFsTemplate; public String storeFile(String filename, InputStream content) { ObjectId fileId = gridFsTemplate.store(content, filename, "application/octet-stream"); return fileId.toString(); } public GridFSFile getFile(String fileId) { return gridFsTemplate.findOne(new Query(Criteria.where("_id").is(new ObjectId(fileId)))); } public void deleteFile(String fileId) { gridFsTemplate.delete(new Query(Criteria.where("_id").is(new ObjectId(fileId)))); } }9.2 变更流监听
监听MongoDB的数据变更事件:
@Component public class ProductChangeListener { private final MongoTemplate mongoTemplate; public ProductChangeListener(MongoTemplate mongoTemplate) { this.mongoTemplate = mongoTemplate; } @PostConstruct public void watchChanges() { Disposable subscription = mongoTemplate .changeStream(Product.class) .watchCollection("products") .listen(changeEvent -> { System.out.println("Change detected: " + changeEvent.getBody()); // 处理变更事件 }); // 应用关闭时取消订阅 Runtime.getRuntime().addShutdownHook(new Thread(subscription::dispose)); } }9.3 全文搜索集成
结合MongoDB的全文索引实现搜索功能:
// 首先在实体类中添加全文索引注解 @Document(collection = "products") @TextIndexed public class Product { @TextIndexed(weight = 2) private String name; @TextIndexed private String description; // 其他字段... } // 搜索实现 public List<Product> searchProducts(String keywords) { TextCriteria criteria = TextCriteria.forDefaultLanguage() .matchingAny(keywords.split(" ")); Query query = TextQuery.queryText(criteria) .sortByScore() .limit(20); return mongoTemplate.find(query, Product.class); }10. 项目结构建议
一个典型的SpringBoot+MongoDB项目推荐结构:
src/main/java └── com.example └── mongodemo ├── config # 配置类 │ ├── MongoConfig.java │ └── WebConfig.java ├── model # 实体类 │ ├── Product.java │ └── Category.java ├── repository # 仓库接口 │ ├── ProductRepository.java │ └── CustomRepositoryImpl.java ├── service # 业务逻辑 │ ├── ProductService.java │ └── impl │ └── ProductServiceImpl.java ├── web # 控制器 │ ├── ProductController.java │ └── exception │ └── GlobalExceptionHandler.java └── MongoDemoApplication.java对于大型项目,可以考虑按功能模块划分:
src/main/java └── com.example └── ecommerce ├── product │ ├── Product.java │ ├── ProductRepository.java │ └── ProductService.java ├── order │ ├── Order.java │ ├── OrderRepository.java │ └── OrderService.java └── EcommerceApplication.java11. 性能监控与指标
11.1 Micrometer指标集成
@Configuration public class MetricsConfig { @Bean public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() { return registry -> registry.config().commonTags( "application", "springboot-mongodb-demo" ); } @Bean public MongoMetricsCommandListener mongoMetricsCommandListener(MeterRegistry registry) { return new MongoMetricsCommandListener(registry); } }11.2 自定义性能指标
@Service public class ProductMetricsService { private final Counter productCreationCounter; private final Timer productQueryTimer; public ProductMetricsService(MeterRegistry registry) { this.productCreationCounter = registry.counter("product.creation.count"); this.productQueryTimer = registry.timer("product.query.time"); } public void incrementProductCreation() { productCreationCounter.increment(); } public void recordQueryTime(Runnable operation) { productQueryTimer.record(operation); } }12. 持续集成与部署
12.1 CI/CD管道配置
示例Jenkinsfile配置:
pipeline { agent any environment { MONGO_URI = credentials('mongodb-uri') } stages { stage('Build') { steps { sh './mvnw clean package -DskipTests' } } stage('Test') { steps { script { docker.image('mongo:4.4').withRun('--name test-mongo -p 27017:27017') { c -> sh './mvnw test' } } } } stage('Deploy') { when { branch 'main' } steps { sh 'kubectl apply -f k8s/deployment.yaml' } } } }12.2 Kubernetes部署配置
示例deployment.yaml:
apiVersion: apps/v1 kind: Deployment metadata: name: springboot-mongodb-app spec: replicas: 3 selector: matchLabels: app: springboot-mongodb template: metadata: labels: app: springboot-mongodb spec: containers: - name: app image: my-registry/springboot-mongodb:${VERSION} env: - name: SPRING_DATA_MONGODB_URI valueFrom: secretKeyRef: name: mongodb-secret key: uri ports: - containerPort: 8080 readinessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 30 periodSeconds: 10 livenessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 45 periodSeconds: 1513. 版本升级与迁移
13.1 SpringBoot版本升级
升级SpringBoot版本时,需要注意MongoDB驱动的兼容性:
- 检查Spring Data MongoDB的兼容性矩阵
- 逐步升级(如2.5.x → 2.7.x → 3.0.x)
- 特别注意事务行为和API变化
13.2 MongoDB版本迁移
迁移MongoDB版本的最佳实践:
- 先在测试环境验证兼容性
- 使用滚动升级策略(副本集)
- 监控性能指标变化
- 回滚计划准备
# 兼容性检查示例 mongo --eval "db.adminCommand({getParameter:1, featureCompatibilityVersion:1})"14. 安全加固措施
14.1 认证与授权
spring: data: mongodb: uri: mongodb://appuser:${MONGO_PASSWORD}@cluster0.example.com:27017,cluster1.example.com:27017/dbname? authSource=admin& authMechanism=SCRAM-SHA-25614.2 网络隔离
- 使用VPC对等连接或私有端点
- 配置安全组/防火墙规则
- 启用TLS加密
14.3 审计日志
@Configuration public class MongoAuditConfig { @Bean public AuditingEventListener auditingEventListener() { return new AuditingEventListener( new MongoAuditingHandler( new MongoMappingContext() ) ); } }15. 成本优化策略
15.1 存储优化
- 使用压缩(snappy或zstd)
- 合理设置TTL索引
- 归档冷数据
15.2 查询优化
- 避免全集合扫描
- 使用覆盖查询
- 限制返回文档大小
15.3 架构优化
- 分片策略优化
- 读写分离
- 合理使用副本集节点
@ReadPreference(ReadPreference.Type.SECONDARY_PREFERRED) public interface ProductRepository extends MongoRepository<Product, String> { // 查询方法 }16. 灾难恢复方案
16.1 备份策略
- 定时快照备份
- 持续oplog备份
- 跨区域复制
16.2 恢复流程
- 验证备份完整性
- 分阶段恢复(先关键数据)
- 数据一致性检查
# 备份示例 mongodump --uri="mongodb+srv://cluster0.example.com/dbname" --out=/backup # 恢复示例 mongorestore --uri="mongodb+srv://newcluster.example.com/dbname" /backup/dbname17. 本地开发环境配置
17.1 Docker Compose配置
version: '3.8' services: mongodb: image: mongo:4.4 container_name: local-mongo environment: MONGO_INITDB_ROOT_USERNAME: admin MONGO_INITDB_ROOT_PASSWORD: admin123 ports: - "27017:27017" volumes: - mongo-data:/data/db healthcheck: test: ["CMD", "mongo", "--eval", "db.adminCommand('ping')"] interval: 5s timeout: 30s retries: 3 mongo-express: image: mongo-express container_name: mongo-express environment: ME_CONFIG_MONGODB_ADMINUSERNAME: admin ME_CONFIG_MONGODB_ADMINPASSWORD: admin123 ME_CONFIG_MONGODB_URL: mongodb://admin:admin123@mongodb:27017/ ports: - "8081:8081" depends_on: mongodb: condition: service_healthy volumes: mongo-data:17.2 开发配置覆盖
在src/main/resources/application-dev.properties中:
spring.data.mongodb.uri=mongodb://admin:admin123@localhost:27017/test?authSource=admin spring.data.mongodb.auto-index-creation=true18. 文档与团队协作
18.1 Swagger集成
@Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.basePackage("com.example.mongodemo.web")) .paths(PathSelectors.any()) .build() .apiInfo(apiInfo()) .directModelSubstitute(ObjectId.class, String.class); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("SpringBoot MongoDB API") .description("API documentation for SpringBoot MongoDB integration") .version("1.0") .build(); } }18.2 数据库变更管理
使用Mongock进行数据库变更管理:
@Configuration public class MongockConfig { @Bean public SpringBootMongock mongock(ApplicationContext springContext, MongoTemplate mongoTemplate) { return new SpringBootMongockBuilder( mongoTemplate, "com.example.mongodemo.changelogs" ) .setApplicationContext(springContext) .setLockQuickConfig() .build(); } }示例变更日志:
@ChangeLog public class DatabaseChangelog { @ChangeSet(order = "001", id = "initProducts", author = "dev") public void initProducts(MongoTemplate mongoTemplate) { mongoTemplate.createCollection("products"); IndexOperations indexOps = mongoTemplate.indexOps(Product.class); indexOps.ensureIndex(new Index().on("name", Sort.Direction.ASC).named("name_idx")); } }19. 跨平台兼容性
19.1 多环境配置
使用Spring Profiles管理不同环境配置:
# application-dev.yml spring: data: mongodb: uri: mongodb://localhost:27017/test # application-prod.yml spring: data: mongodb: uri: ${PROD_MONGO_URI}19.2 多数据源配置
@Configuration @EnableMongoRepositories( basePackages = "com.example.primary.repository", mongoTemplateRef = "primaryMongoTemplate" ) public class PrimaryMongoConfig { @Bean @Primary @ConfigurationProperties(prefix = "spring.data.mongodb.primary") public MongoProperties primaryMongoProperties() { return new MongoProperties(); } @Primary @Bean(name = "primaryMongoTemplate") public MongoTemplate primaryMongoTemplate() { return new MongoTemplate(primaryMongoFactory()); } @Bean @Primary public MongoDatabaseFactory primaryMongoFactory() { return new SimpleMongoClientDatabaseFactory(primaryMongoProperties().getUri()); } }20. 未来演进方向
- 响应式编程:迁移到Spring WebFlux和ReactiveMongoRepository
- 云原生集成:使用MongoDB Atlas和Kubernetes Operator
- 多模型数据库:利用MongoDB的时间序列、图计算等特性
- AI集成:结合MongoDB的向量搜索功能实现AI应用
// 响应式MongoDB示例 public interface ReactiveProductRepository extends ReactiveMongoRepository<Product, String> { Flux<Product> findByCategory(String category); @Query("{ 'name': { $regex: ?0 } }") Flux<Product> findByNameRegex(String regex); }在实际项目演进过程中,我发现渐进式改进比大规模重构更可行。比如可以先从简单的CRUD开始,然后逐步引入事务、聚合等高级特性,最后再考虑分片和全局分布式部署。