基于Mongock和Spring Boot的MongoDB布尔转长整型数据迁移
MongoDB布尔字段转长整型的迁移方案
方案一:直接用MongoDB Shell执行迁移脚本
这是最直接高效的方式,无需修改Java代码,先在数据库层面完成数据转换:
db.animal.updateMany( {}, [ { $set: { isBirthYear: { $cond: { if: "$isBirthYear", then: NumberLong(1), else: NumberLong(0) } } } } ] )
执行脚本后,所有文档的isBirthYear字段会从布尔类型转为长整型,true对应1,false对应0。之后直接将你的Animal类字段类型改为long即可,不需要额外的V2类。
方案二:在Spring Boot应用中编写迁移代码
如果希望应用启动时自动完成迁移,可以编写一个启动执行组件:
@Component public class AnimalDataMigration implements ApplicationRunner { @Autowired private MongoTemplate mongoTemplate; @Override public void run(ApplicationArguments args) throws Exception { // 查询所有布尔类型的isBirthYear文档 Query query = new Query(); query.addCriteria(Criteria.where("isBirthYear").type(BsonType.BOOLEAN)); List<Document> animals = mongoTemplate.find(query, Document.class, "animal"); for (Document doc : animals) { boolean oldValue = doc.getBoolean("isBirthYear"); doc.put("isBirthYear", oldValue ? 1L : 0L); mongoTemplate.save(doc, "animal"); } } }
启动应用后,这段代码会自动完成字段类型转换。执行一次后即可删除该组件,再修改Animal类的字段类型。
为何不推荐用AnimalV2类?
用两个实体类映射同一个集合会增加代码复杂度,后续维护容易混淆,且完全没必要——不管是直接操作数据库还是在应用层迁移,都能在保留原有实体类结构的前提下完成转换,无需额外定义V2类。
内容的提问来源于stack exchange,提问作者hungtam
相关产品推荐
相关产品推荐

