SpringBoot启动时如何在MongoDB中自动创建不存在的集合与初始文档
SpringBoot MongoDB 启动自动初始化集合及初始文档实现方案
MongoDB 默认采用懒加载机制,只有对集合执行第一次读写操作时才会创建对应的集合,因此需要在项目启动完成的钩子阶段主动执行幂等的初始化逻辑,具体实现步骤如下:
1. 定义对应集合的文档实体类
import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; @Document(collection = "custom_collection") // 替换为你实际的集合名称 public class CustomDoc { @Id private String id; private String name; private Integer status; // 空构造、全参构造、getter、setter自行补充 public CustomDoc() {} public CustomDoc(String name, Integer status) { this.name = name; this.status = status; } // 省略getter、setter }
2. 编写启动初始化逻辑
推荐通过监听ApplicationReadyEvent事件实现,保证MongoDB相关依赖全部加载完成后再执行操作,逻辑自带幂等性,重复启动不会重复写入初始数据:
import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Query; import org.springframework.boot.context.event.ApplicationReadyEvent; import javax.annotation.Resource; @Configuration public class MongoInitConfig implements ApplicationListener<ApplicationReadyEvent> { @Resource private MongoTemplate mongoTemplate; @Override public void onApplicationEvent(ApplicationReadyEvent event) { String collectionName = "custom_collection"; // 和实体类的集合名保持一致 // 1. 不存在集合则先创建集合 if (!mongoTemplate.collectionExists(collectionName)) { mongoTemplate.createCollection(collectionName); } // 2. 判断集合内是否已有文档,没有则插入初始文档 long docCount = mongoTemplate.count(new Query(), CustomDoc.class); if (docCount == 0) { // 替换为你需要的初始字段值 CustomDoc initDoc = new CustomDoc("默认名称", 1); mongoTemplate.insert(initDoc); } } }
注意事项
如果你的项目配置了MongoDB的权限认证,需要确保对应的账号有createCollection和insert的权限,否则初始化会失败。
如果你不想用事件监听的方式,也可以把初始化逻辑放在实现了CommandLineRunner的类中,效果完全一致。
内容的提问来源于stack exchange,提问作者neverEugene
相关产品推荐
相关产品推荐

