news 2026/10/28 6:03:54

SpringBoot与MongoDB集成开发实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot与MongoDB集成开发实战指南

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 性能优化建议

  1. 查询优化:

    • 使用投影只返回需要的字段
    • 避免全表扫描,确保查询使用索引
    • 限制返回结果数量
  2. 索引策略:

    • 为常用查询字段创建索引
    • 考虑复合索引的顺序
    • 定期分析慢查询并优化索引
  3. 批量操作:

    • 使用批量插入代替单条插入
    • 批量更新时使用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后,我总结了以下宝贵经验:

  1. 文档设计原则:

    • 避免过度嵌套(一般不超过3层)
    • 将频繁一起访问的数据放在同一文档中
    • 对写多读少的字段考虑单独集合
  2. 性能调优技巧:

    • 使用explain()分析查询执行计划
    • 监控慢查询日志(profile级别设置为1或2)
    • 合理使用$lookup替代应用层join
  3. 迁移策略:

    • 大型项目采用双写策略逐步迁移
    • 使用变更数据捕获(CDC)保持数据同步
    • 考虑使用MongoDB Connector for Kafka
  4. 备份与恢复:

    • 定期执行mongodump和mongorestore
    • 配置oplog实现时间点恢复
    • 测试备份恢复流程(至少每季度一次)
  5. 安全实践:

    • 启用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.java

11. 性能监控与指标

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: 15

13. 版本升级与迁移

13.1 SpringBoot版本升级

升级SpringBoot版本时,需要注意MongoDB驱动的兼容性:

  1. 检查Spring Data MongoDB的兼容性矩阵
  2. 逐步升级(如2.5.x → 2.7.x → 3.0.x)
  3. 特别注意事务行为和API变化

13.2 MongoDB版本迁移

迁移MongoDB版本的最佳实践:

  1. 先在测试环境验证兼容性
  2. 使用滚动升级策略(副本集)
  3. 监控性能指标变化
  4. 回滚计划准备
# 兼容性检查示例 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-256

14.2 网络隔离

  • 使用VPC对等连接或私有端点
  • 配置安全组/防火墙规则
  • 启用TLS加密

14.3 审计日志

@Configuration public class MongoAuditConfig { @Bean public AuditingEventListener auditingEventListener() { return new AuditingEventListener( new MongoAuditingHandler( new MongoMappingContext() ) ); } }

15. 成本优化策略

15.1 存储优化

  1. 使用压缩(snappy或zstd)
  2. 合理设置TTL索引
  3. 归档冷数据

15.2 查询优化

  1. 避免全集合扫描
  2. 使用覆盖查询
  3. 限制返回文档大小

15.3 架构优化

  1. 分片策略优化
  2. 读写分离
  3. 合理使用副本集节点
@ReadPreference(ReadPreference.Type.SECONDARY_PREFERRED) public interface ProductRepository extends MongoRepository<Product, String> { // 查询方法 }

16. 灾难恢复方案

16.1 备份策略

  1. 定时快照备份
  2. 持续oplog备份
  3. 跨区域复制

16.2 恢复流程

  1. 验证备份完整性
  2. 分阶段恢复(先关键数据)
  3. 数据一致性检查
# 备份示例 mongodump --uri="mongodb+srv://cluster0.example.com/dbname" --out=/backup # 恢复示例 mongorestore --uri="mongodb+srv://newcluster.example.com/dbname" /backup/dbname

17. 本地开发环境配置

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=true

18. 文档与团队协作

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. 未来演进方向

  1. 响应式编程:迁移到Spring WebFlux和ReactiveMongoRepository
  2. 云原生集成:使用MongoDB Atlas和Kubernetes Operator
  3. 多模型数据库:利用MongoDB的时间序列、图计算等特性
  4. 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开始,然后逐步引入事务、聚合等高级特性,最后再考虑分片和全局分布式部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/28 6:03:54

MCP工具调用超时重试导致重复订单?幂等方案与实操全解析

1. 订单写入场景下的超时重试难题拆解订单写入这件事&#xff0c;看起来就是一条 INSERT 语句的事&#xff0c;但一旦把它放到 MCP 工具调用链路里&#xff0c;再叠加网络抖动、服务端处理慢、客户端超时重试&#xff0c;问题就变得相当棘手。我自己在做一个基于 MCP 协议的订单…

作者头像 李华
网站建设 2026/10/28 6:03:21

Claude Code Mods 实战:用 TypeScript 扩展终端 AI 工具与界面

1. Claude Code Mods 到底在折腾什么第一次听到 Claude Code Mods 这个词&#xff0c;很多人会以为是某种插件市场或者主题包。其实不是。它更像是一套“给 Claude Code 这个终端里的编程助手加装外挂”的思路和工具集合。核心目标就两个&#xff1a;第一&#xff0c;让 Claude…

作者头像 李华
网站建设 2026/10/28 6:02:31

Manus开放标准:重构AI Agent技能复用新范式

1. 项目概述&#xff1a;Manus开放标准如何重构Agent能力体系在AI Agent开发领域&#xff0c;技能复用一直是个棘手的难题。传统Agent框架中&#xff0c;每个新任务都需要从头开发专用技能模块&#xff0c;这种重复造轮子的模式严重制约了开发效率。Manus提出的开放标准方案&am…

作者头像 李华
网站建设 2026/10/28 6:02:16

防止系统休眠的脚本实现与优化技巧

1. 项目概述这个脚本的核心功能是通过模拟用户活动来阻止系统进入睡眠状态或关闭显示器。在实际工作中&#xff0c;我们经常会遇到这样的情况&#xff1a;需要让电脑长时间保持运行状态&#xff0c;但又不想手动操作来防止系统休眠。比如下载大文件、渲染视频、运行长时间计算任…

作者头像 李华
网站建设 2026/10/28 6:01:57

Redis Exporter 安装配置与 Prometheus 监控实践

1. Redis Exporter 是什么&#xff1f;Redis Exporter 是一个专门用于将 Redis 监控数据暴露给 Prometheus 的工具。它通过 Redis 的 INFO 命令获取 Redis 实例的运行状态信息&#xff0c;并将其转换为 Prometheus 可识别的 metrics 格式。在实际生产环境中&#xff0c;Redis E…

作者头像 李华
网站建设 2026/10/28 6:01:52

Coze+Banana2批量生成小红书财经手绘图教程

1. 项目概述&#xff1a;用CozeBanana2批量生成小红书爆款手绘图最近在帮一家财经自媒体做内容升级时&#xff0c;发现他们每天最耗时的工作就是制作那种小红书爆款风格的手绘财经知识图。传统做法需要设计师用Procreate一张张画&#xff0c;平均每张图耗时2小时&#xff0c;而…

作者头像 李华