问题标签 [mongock]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
588 浏览

mongock - 带有事务的 Mongock 迁移失败

我正在运行一个 spring boot 2.4.3 应用程序,并且我有一个支持事务的 mongodb 4 集群(我使用 run-rs 在本地运行它)。我也在使用spring数据mongodb。我正在尝试为数据库迁移集成 mongock(最新版本 - 4.3.8),但我遇到了一个我无法解决的问题。正如我们所知,最新版本的 mongock 默认使用事务。我有以下变更集,它只是为我的一个实体创建了一个 mongodb 集合。

当我运行应用程序时,迁移失败并出现以下错误:

如果我按预期禁用 mongock 事务,则迁移成功应用。我不想禁用数据库迁移的事务,但我不知道问题出在哪里。

编辑:我发现了问题所在 - 因为 Spring boot 包含多文档事务,并且此类事务不支持创建集合命令。但是,我应该如何处理集合的创建?

0 投票
1 回答
244 浏览

java - Mongock 失败:NoClassDefFoundError org/springframework/data/mongodb/MongoDatabaseFactory

我在我的 Spring Boot 应用程序中使用以下 pom:

当我运行应用程序时,java -jar my-app.jar出现以下错误:

但是当我用-noverify它运行应用程序时似乎一切正常

拜托,有人可以帮我吗?

0 投票
1 回答
46 浏览

java - 如何在 Mongock 迁移后启动 Hazelcast?

使用默认配置 Hazelcast 在 Mongock 之前运行。我使用 Hazelcast ITopic 进行微服务之间的产品/缺点通信。但是我在使用 Mongock 执行数据库迁移之前收到了来自该主题的数据。我有两个解决方案:

  1. 等待 Mongock 事件“SpringMigrationSuccessEvent”,然后手动加载 Hazelcast,但我无法为 Mongock 的事件处理找到正确的 POM 配置,也无法以编程方式启动 Hazelcast 配置。
  2. 在最后一个 Mongock 的 ChangeSet 和 Hazelcast Cons Itopic 的第一条消息之间使用 CountDownLatch
0 投票
1 回答
209 浏览

mongodb - Mongodb - 在迁移中更新具有> 100,000个文档的集合

在更新这个庞大的集合时,以下迁移代码似乎卡住了。

应用程序日志的最后几行表明变更集被调用,但后续的没有被调用。

2021-05-11 08:00:29.385 INFO [product-service,,,] 1 --- [
main] caamongock.changelog.Migration:向产品添加租户

2021-05-11 08:00:29.576 INFO [product-service,,,] 1 --- [
main] org.mongodb.driver.connection:打开的连接

因此,Spring 执行器运行状况探测失败,并且容器不断重新启动。是否有更好的 API 可以更快地使用?

笔记:

  1. 使用的版本:'com.github.cloudyrock:mongock:1.12'
  2. 下面是配置

这是日志


2021-05-10 10:59:33.406 INFO [product-service,,,] 1 --- [main] org.mongodb.driver.connection:打开连接 [connectionId{localValue:16, serverValue:26359638}] 到虚拟-clusterr-39649.servers.mongodirector.com:27017 2021-05-10 10:59:33.525 信息 [product-service,,,] 1 --- [main] c.github.cloudyrock.mongock.LockChecker : Mongbee 尝试获取锁 2021-05-10 10:59:33.574 INFO [product-service,,,] 1 --- [main] c.github.cloudyrock.mongock.LockChecker :锁定被其他进程占用,直到:Mon May 10 11:01:03 GMT 2021 2021-05-10 10:59:33.574 INFO [product-service,,,] 1 --- [main] c.github.cloudyrock.mongock.LockChecker:Mongock 要睡觉了等待锁定:90265 毫秒(1 分钟)2021-05-10 11:01:03.839 INFO [product-service,,,] 1 --- [main] c.github.cloudyrock.mongock.LockChecker : Mongbee 试图获取锁 2021-05-10 11:01:03.844 INFO [product-service,,,] 1 --- [main] c.github.cloudyrock.mongock.LockChecker : Mongbee 获得锁定到: 2021 年 5 月 10 日星期一 11:04:03 GMT 2021-05-10 11:01:03.844 INFO [product-service,,,] 1 --- [main] com.github.cloudyrock.mongock.Mongock : Mongock 开始数据迁移序列.. 2021-05-10 11:01:03.982 INFO [product-service,,,] 1 --- [main] org.reflections.Reflections :Reflections 花了 60 毫秒扫描 1 个 url,产生2 个键和 3 个值 2021-05-10 11:01:04.038 INFO [product-service,,,] 1 --- [main] com.github.cloudyrock.mongock.Mongock : com.github.cloudyrock.mongock.ChangeEntry @7abd0e71 通过 2021-05-10 11:01:04.046 INFO [product-service,,,] 1 --- [main] com。github.cloudyrock.mongock.Mongock : com.github.cloudyrock.mongock.ChangeEntry@6635f36 pass over 2021-05-10 11:01:04.047 INFO [product-service,,,] 1 --- [main] com.github .cloudyrock.mongock.Mongock : com.github.cloudyrock.mongock.ChangeEntry@61352a80 通过 2021-05-10 11:01:04.052 INFO [product-service,,,] 1 --- [main] com.github。 cloudyrock.mongock.Mongock : com.github.cloudyrock.mongock.ChangeEntry@7576ed14 通过 2021-05-10 11:01:04.054 INFO [product-service,,,] 1 --- [main] com.github.cloudyrock .mongock.Mongock : com.github.cloudyrock.mongock.ChangeEntry@b0302179 通过 2021-05-10 11:01:04.068 INFO [product-service,,,] 1 --- [main] com.github.cloudyrock。 mongock.Mongock : com.github.cloudyrock.mongock.ChangeEntry@e6caade0 通过 2021-05-10 11:01:04。071 INFO [product-service,,,] 1 --- [main] com.github.cloudyrock.mongock.Mongock : com.github.cloudyrock.mongock.ChangeEntry@2688129a 通过 2021-05-10 11:01:04.073 INFO [product-service,,,] 1 --- [main] com.github.cloudyrock.mongock.Mongock : com.github.cloudyrock.mongock.ChangeEntry@e46af677 通过 2021-05-10 11:01:04.075 INFO [product-service,,,] 1 --- [main] com.github.cloudyrock.mongock.Mongock : com.github.cloudyrock.mongock.ChangeEntry@d788b92f 通过 2021-05-10 11:01:04.077 INFO [ product-service,,,] 1 --- [main] caamongock.changelog.Migration:将组织添加到问题 2021-05-10 11:01:04.158 INFO [product-service,,,] 1 --- [main] org.mongodb.driver.connection :打开的连接 [connectionId{localValue:17, serverValue:26359725}] 到 dummy-clusterr-39649.servers.mongodirector.com:27017

0 投票
2 回答
494 浏览

mongodb - Spring-Boot:如何检查 Mongock 是否已完成?

我正在使用 Mongock 使用 Spring-Boot 迁移和初始化我的 MongoDB 数据库。我需要的是一种检查何时应用所有变更日志的方法。

如何检查 Mongock 是否完成了所有的变更日志/变更集?

我发现 Mongock 创建了一个集合mongockLock,其中在迁移运行时有一个条目。

检查上述集合中是否缺少任何文档就足以得出 Mongock 已完成更改日志的结论吗?

如何查询此集合中的文档?

0 投票
1 回答
167 浏览

database - 使用 Mongock 按环境(dev、pprod、prod)使用特定数据初始化数据库的最佳方法

我正在使用 Mongock 来初始化一个带有一些配置的 MongoDb 数据库,通过调用 system. {systemId: 'a', authorizedUsers: ['user1', user2]}.

我的问题来自这样一个事实,即在 dev 中 user1 和 user2 被授权但在 prod 中只有 user1 被授权。

  • {env: 'dev', systemId: 'a', authorizedUsers: ['user1', user2]}当我们搜索授权用户时,添加一个 env 属性并将其用作过滤器会更好吗?缺点是数据库中有不同的配置可用,我们需要选择正确的配置。
  • 还是在 Mongock 初始化函数(ChangeSet)中读取运行 Mongock 的环境并初始化正确的数据是否更好?缺点是我们无法在正确的环境中测试 init 的正确性
  • 更好的解决方案?

预先感谢您的回复

编辑以澄清这两个选项

  • 选项1

  • 选项 2:(由@Mongock 团队提出)(已选择)
0 投票
0 回答
27 浏览

mongodb - Mongock 在集合中的索引冲突上插入重复的变更集

我的应用程序使用 mongock 4.3.8,并且当有一个 changeSet 尝试为与现有索引相比具有不同条件的集合创建索引时,在 dbchangelog 集合中创建了具有“状态”的重复条目:“失败” ,应用程序卡在重启循环中,每次尝试时,dbchangelog 集合中都有一个新条目,用于相同的 changeId 并带有“state”:“FAILED”。尽管在应用程序方面出现这种与不同条件(背景、稀疏等)发生索引冲突的情况是错误的,但现在的开销是清理数据库中的重复条目,我相信早期版本的 mongock 并非如此.

有一个类似的问题(Mongock 在 runAlways=true 上插入重复的变更集)解决了 runAlways=true 的情况并且可以工作,但似乎仍然存在另一种情况(上面提到的)导致重复的 changeId

0 投票
0 回答
30 浏览

java - 有没有办法使用 Regex 在 Mongo 上执行 indexOps?

我的数据库中有一些具有“动态名称”的集合,假设我有一些存储来自特定国家/地区的动物数据的集合,所以在我的数据库中Animals我将​​有以下集合:

  • 澳大利亚-动物
  • 日本-动物
  • 巴西-动物

有时我需要将新的集合添加到我的数据库中,目前我有一个脚本可以向国家/地区添加索引,例如:

基本上这个类的工作是为命名的集合创建索引,Australia-Animals但将来如果我添加一个带有新国家前缀的新集合,我将不得不复制整段代码并更改集合的名称字符串。我尝试使用 *, $, %, 作为正则表达式,但它们都不起作用。除了获取集合名称并添加到列表中,还有其他方法contains("name")吗?

我很难做到:

它可以工作,但似乎效率很低,必须遍历集合才能完成这项工作。

0 投票
1 回答
211 浏览

java - java mongo json模式验证

我想知道 mongock 是否支持合成器,例如:

当它在集合创建期间构建验证时,或者如果您知道一个库可用于“合并”一个独特的大 json 模式中的所有引用,该模式可作为用于验证的 Document 的输入。

我用来验证集合的代码是:

正如您现在所看到的,我只是从文件中读取 json 模式并使用 Document 对象对其进行解析。

我想让 json 模式尽可能简单以便人类可读,并且我有扩展其他对象的对象,因此将 json 模式文件分开来表示超级对象会更容易。

我正在使用 java 1.13 和 spring boot 2.4.2。

0 投票
1 回答
42 浏览

spring - 更快地启动 Mongock,因此当更改日志失败时,应用程序在运行状况检查通过之前崩溃

我们最近将 MongoCk 添加到我们的 Spring 5 应用程序(使用 Spring 运行程序),但在我们的部署过程中遇到了一些问题。我们在部署过程中的最后一步是运行状况检查,部署服务器每 5 秒检查一次运行状况页面,持续 5 分钟。一旦它得到正确的响应,就认为部署成功并完成。

问题是 MongoCk 似乎只在应用程序上下文加载后 30 秒左右开始迁移,导致运行状况检查通过,并且在服务“成功”启动后迁移可能失败。

使用独立的运行器可能会解决这个问题,但我们真的很喜欢在变更日志中其他 bean 的可用性。那么有没有办法强制将变更日志作为加载应用程序上下文的一部分进行处理?或者这种延迟来自哪里,我们如何减少它?