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