【Liquibase & MongoDB】使用 <xml> ext标签 的使用

Liquibase 提供了 ext:runCommand 来执行 MongoDB 的命令,而不是 executeSql

如果你在使用 MongoDB,不需要使用 executeSql,而是使用 ext:runCommand。
确保你没有拼写错误或大小写问题。
如果你想使用 executeSql,确保你已经启用了 Liquibase Pro(商业版)以及相关的扩展。
如果你不打算使用商业版,建议你直接使用 MongoDB 特定的扩展语法。

1、MongoDB 的更新操作示例:

<changeSet id="qwewqeqw" author="author_name">
    <ext:runCommand>
        <ext:command>
            {
                "update": "集合", 
                "updates": [
                    {
                        "q": { "字段": { "$exists": false } },
                        "u": { "$set": { "字段": 1 } },
                        "upsert": false
                    }
                ]
            }
        </ext:command>
    </ext:runCommand>
</changeSet>

MongoDB 新增操作
在 MongoDB 中,插入文档的操作通常是使用 insertOne 或 insertMany,具体取决于你是插入一个文档还是多个文档。

Liquibase 扩展 MongoDB 时,我们可以通过 ext:runCommand 来执行类似的操作。
插入单个文档示例 (insertOne)
如果你想在 MongoDB 中向集合中插入一个新的文档,可以使用以下 XML 配置:

<changeSet id="1" author="author_name">
    <ext:runCommand>
        <ext:command>
            {
                "insert": "yourCollection",  <!-- 集合名 -->
                "documents": [
                    {
                        "fontName": "Arial",
                        "fontSize": 12,
                        "fontCopyright": "Some copyright info"
                    }
                ]
            }
        </ext:command>
    </ext:runCommand>
</changeSet>

插入多个文档示例 (insertMany)
如果你需要插入多个文档,可以使用 insertMany,以下是相应的操作:

<changeSet id="2" author="author_name">
    <ext:runCommand>
        <ext:command>
            {
                "insert": "yourCollection",  <!-- 集合名 -->
                "documents": [
                    { "fontName": "Arial", "fontSize": 12, "fontCopyright": "Some copyright info" },
                    { "fontName": "Times New Roman", "fontSize": 14, "fontCopyright": "Other copyright info" }
                ]
            }
        </ext:command>
    </ext:runCommand>
</changeSet>

解释
insert: 表示你要执行的是插入操作,后面跟的是集合名称。
documents: 一个包含要插入文档的数组。每个文档是一个符合 MongoDB 格式的 JSON 对象。
其他插入操作
如果你想实现不同的插入类型(如带条件的插入),也可以通过 ext:runCommand 来执行。例如,带有 upsert(更新或插入)操作的插入。

使用 upsert 插入或更新文档
如果你希望在文档存在时更新它,而在文档不存在时插入新的文档,可以使用 upsert 选项。

<changeSet id="3" author="author_name">
    <ext:runCommand>
        <ext:command>
            {
                "update": "yourCollection",  <!-- 集合名 -->
                "updates": [
                    {
                        "q": { "fontName": "Arial" },  <!-- 查询条件 -->
                        "u": { "$set": { "fontSize": 16, "fontCopyright": "Updated copyright info" } },  <!-- 更新操作 -->
                        "upsert": true  <!-- 如果没有符合条件的文档,则插入新文档 -->
                    }
                ]
            }
        </ext:command>
    </ext:runCommand>
</changeSet>

结论
通过 ext:runCommand 标签,你可以在 Liquibase 中执行 MongoDB 的插入操作,如 insertOne 或 insertMany。根据你的需求,你可以选择插入单个文档、多个文档,或者执行带有条件的插入/更新(upsert)操作。

MongoDB 重命名集合
使用 Liquibase 扩展进行集合重命名
通过 ext:runCommand 标签,你可以直接执行 MongoDB 的 renameCollection 操作。下面是实现集合重命名的 Liquibase XML 配置示例:

示例:重命名集合
假设你要将集合 oldCollection 重命名为 newCollection,你可以使用以下 XML 配置:

<changeSet id="1" author="author_name">
    <ext:runCommand>
        <ext:command>
            {
                "renameCollection": "oldCollection",  <!-- 旧集合名 -->
                "to": "newCollection"  <!-- 新集合名 -->
            }
        </ext:command>
    </ext:runCommand>
</changeSet>

解释
renameCollection: 表示要重命名的集合的原始名称(即旧集合名)。
to: 新的集合名称。
注意事项
在 MongoDB 中,renameCollection 操作默认会在重命名的过程中锁定源集合,所以执行此操作时需要小心,尤其是在高并发的环境中,可能会影响系统的性能。
renameCollection 只能在同一个数据库内进行操作,即源集合和目标集合必须位于同一数据库中。
如果目标集合已经存在,默认情况下 MongoDB 会报错。如果需要覆盖已存在的目标集合,可以通过设置 dropTarget: true 来允许覆盖。
覆盖已存在的目标集合(dropTarget: true)
如果你希望在目标集合已经存在时强制覆盖,可以加上 dropTarget: true 参数:

<changeSet id="2" author="author_name">
    <ext:runCommand>
        <ext:command>
            {
                "renameCollection": "oldCollection",  <!-- 旧集合名 -->
                "to": "newCollection",  <!-- 新集合名 -->
                "dropTarget": true  <!-- 如果目标集合存在,则覆盖 -->
            }
        </ext:command>
    </ext:runCommand>
</changeSet>

总结
通过 ext:runCommand,你可以直接执行 MongoDB 的 renameCollection 命令来重命名集合。这是一种非常灵活的方式,可以用于所有 MongoDB 操作(包括集合重命名、更新、插入等),不需要 Liquibase 提供专门的标签。

额外的提示
测试环境:在生产环境中执行任何数据库变更操作之前,确保在测试环境中先行验证该变更,以确保其按预期工作且没有副作用。
锁定问题:如果在一个高并发的环境中执行集合重命名操作,可能会遇到性能问题或锁定问题。务必进行适当的监控和调优。

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&gt; &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt; &lt;groupId&gt;com.learningpath&lt;/groupId&gt; &lt;artifactId&gt;learning-core&lt;/artifactId&gt; &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt; &lt;name&gt;learning-core&lt;/name&gt; &lt;description&gt;learning-core&lt;/description&gt; &lt;properties&gt; &lt;java.version&gt;17&lt;/java.version&gt; &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt; &lt;project.reporting.outputEncoding&gt;UTF-8&lt;/project.reporting.outputEncoding&gt; &lt;spring-boot.version&gt;3.0.2&lt;/spring-boot.version&gt; &lt;/properties&gt; &lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-data-jpa&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-data-mongodb&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-security&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.ai&lt;/groupId&gt; &lt;artifactId&gt;spring-ai-openai-spring-boot-starter&lt;/artifactId&gt; &lt;version&gt;0.8.1&lt;/version&gt; &lt;!-- 需与Spring Boot版本匹配 --&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.mybatis.spring.boot&lt;/groupId&gt; &lt;artifactId&gt;mybatis-spring-boot-starter&lt;/artifactId&gt; &lt;version&gt;3.0.0&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;com.mysql&lt;/groupId&gt; &lt;artifactId&gt;mysql-connector-j&lt;/artifac
03-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XMatata

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值