You need to enable JavaScript to run this app. Spring Boot项目中如何判断Mongock是否已完成所有changelog执行
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot项目中如何判断Mongock是否已完成所有changelog执行

Mongock迁移执行状态判断及查询方法

mongockLock集合的判断逻辑说明

你提到的mongockLock是Mongock实现分布式锁的核心集合,迁移任务启动时会写入锁记录,无论迁移最终执行成功还是失败,任务结束后都会释放锁并删除对应记录,所以查询到该集合无文档只能说明当前没有正在运行的Mongock迁移任务,不能直接判定所有changelog都执行成功:如果迁移过程中出现异常中断,锁同样会被释放,此时集合为空但迁移并未完成全部流程。

要完全确认所有changelog/changeset都执行完成,需要同时满足两个条件:

  • mongockLock集合无任何文档,无正在运行的迁移任务
  • mongockChangeLog(Mongock用于记录迁移历史的集合)中所有待执行的changelog记录的状态均为SUCCESS,且记录的版本、数量和你项目中定义的迁移脚本完全匹配

集合查询方法

1. Mongo Shell 直接查询

查询mongockLock集合,确认是否有正在运行的任务:

db.mongockLock.find({})
// 如果你使用的是Mongock 5+默认配置,集合名是下划线格式:
// db.mongock_lock.find({})

查询mongockChangeLog集合,验证迁移执行结果:

// 查询所有执行成功的迁移记录
db.mongockChangeLog.find({status: "SUCCESS"}).sort({executedAt: -1})
// 统计成功执行的changeset总数
db.mongockChangeLog.countDocuments({status: "SUCCESS"})
// Mongock 5+版本使用的集合名:
// db.mongock_change_log.find({status: "SUCCESS"})

2. Spring Boot 项目中代码查询

通过注入MongoTemplate实现集合查询:

import org.springframework.beans.factory.annotation.Autowired;
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.bson.Document;
import java.util.List;

public class MongockStatusService {
    @Autowired
    private MongoTemplate mongoTemplate;

    // 判断是否存在正在运行的迁移任务
    public boolean isMigrating() {
        return !mongoTemplate.findAll(Document.class, "mongockLock").isEmpty();
    }

    // 查询所有执行成功的迁移记录
    public List<Document> getSuccessMigrationRecords() {
        Query query = Query.query(Criteria.where("status").is("SUCCESS"));
        return mongoTemplate.find(query, Document.class, "mongockChangeLog");
    }
}

注意:如果你自定义过Mongock的集合命名,需要把上述代码和查询语句中的集合名替换为你自定义的名称。

内容的提问来源于stack exchange,提问作者1Z10

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 12:54:03