You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 00:25:00