当前位置: 首页 > 知识库问答 >
问题:

Mongodb-在迁移过程中更新超过100000个文档的集合

百里君博
2023-03-14

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

@ChangeSet(order = "010", id = "add_tenant_to_product", author = "pn")
fun addTenantToProduct(mongoTemplate: MongoTemplate) {
    log.info("Adding tenants to products")
    val query = Query()
    val update = Update()
    update.set("tenants", arrayOf("shared"))

    mongoTemplate.updateMulti(query, update, Product::class.java)
}

@ChangeSet(order = "011", id = "add_tenant_to_product_version", author = "pn")
fun addTenantToProductVersion(mongoTemplate: MongoTemplate) {
    log.info("Adding tenants to product-version")
    val query = Query()
    val update = Update()
    ...

应用程序日志的最后几行表示已调用更改集,但随后的更改集未被调用。

2021-05-11 08:00:29.385INFO[product-service,,] 1 --- [
main]c.a.a.mongock.changelog.迁移:将租户添加到产品

2021-05-11 08:00:29.576信息[产品服务,,,]1---[br>main]组织。mongodb。驾驶员连接:打开的连接

Spring执行器健康探头因此发生故障,容器继续重新启动。是否有更好的API可以使用,而且速度更快?

注:

  1. 使用的版本为:com.github.cloudyrock:mongock:1.12'
kotlin prettyprint-override">@Profile("!tenant")
@Configuration
class MongockConfig : AbstractMongoConfiguration() {

    @Value("\${spring.data.mongodb.uri}")
    private lateinit var uri: String

    @Value("\${spring.data.mongodb.database}")
    private lateinit var database: String

    override fun mongoClient(): MongoClient {
        return MongoClient(MongoClientURI(uri))
    }

    override fun getDatabaseName(): String {
        return database
    }

    @Bean
    fun mongock(): Mongock {
        return MongockBuilder(mongoClient(), databaseName, "com.somepackage.mongock.changelog")
            .setMongoTemplate(mongoTemplate())
            .setLockQuickConfig()
            .build()
    }
}

这是日志

2021-05-10 10:59:33.406信息[产品服务,,,]1---[main]组织。mongodb。驾驶员连接:打开到dummy-clusterr-39649的连接[connectionId{localValue:16,serverValue:26359638}]。服务器。mongodirector。com:270172021-05-10:59:33.525信息[产品服务,,,]1---[main]c.github。克劳德洛克。蒙哥克。LockChecker:Mongbee试图获得锁2021-05-10 10:59:33.574信息[product service,,,]1---[main]c.github。克劳德洛克。蒙哥克。LockChecker:锁定由其他进程执行,直到:周一5月10日11:01:03 GMT 2021 2021 05-10 10:59:33.574信息[产品服务,,,]1---[主]c.github。克劳德洛克。蒙哥克。锁检查器:Mongock正在睡觉等待锁:90265毫秒(1分钟)2021-05-10 11:01:03.839信息[产品服务,,,,]1---[main]c.github。克劳德洛克。蒙哥克。LockChecker:Mongbee试图获取锁2021-05-10 11:01:03.844信息[product service,,,]1---[main]c.github。克劳德洛克。蒙哥克。锁检查器:Mongbee获得锁的时间:周一至5月10日11:04:03 GMT 2021 2021 05-10 11:01:03.844信息[产品服务,,,]1---[主要]com.github.克劳德洛克。蒙哥克。Mongock:Mongock正在启动数据迁移序列。。2021-05-10 11:01:03.982信息[product service,,,]1---[main]组织。反思。反射:反射花了60毫秒扫描1个URL,生成2个键和3个值2021-05-10 11:01:04.038信息[product service,,,]1---[main]com.github.克劳德洛克。蒙哥克。Mongock:com.github.克劳德洛克。蒙哥克。ChangeEntry@7abd0e71传递2021-05-10 11:01:04.046信息[product service,,,]1---[main]com.github.克劳德洛克。蒙哥克。Mongock:com.github.克劳德洛克。蒙哥克。ChangeEntry@6635f36传递2021-05-10 11:01:04.047信息[product service,,,]1---[main]com.github.克劳德洛克。蒙哥克。Mongock:com.github.克劳德洛克。蒙哥克。ChangeEntry@61352a80通过2021-05-10 11:01:04.052信息[product service,,,]1---[main]com.github.克劳德洛克。蒙哥克。Mongock:com.github.克劳德洛克。蒙哥克。ChangeEntry@7576ed14传递2021-05-10 11:01:04.054信息[product service,,,]1---[main]com.github.克劳德洛克。蒙哥克。Mongock:com.github.克劳德洛克。蒙哥克。ChangeEntry@b0302179传递2021-05-10 11:01:04.068信息[product service,,,]1---[main]com.github.克劳德洛克。蒙哥克。Mongock:com.github.克劳德洛克。蒙哥克。ChangeEntry@e6caade0传递2021-05-10 11:01:04.071信息[product service,,,]1---[main]com.github.克劳德洛克。蒙哥克。Mongock:com.github.克劳德洛克。蒙哥克。ChangeEntry@2688129a传递2021-05-10 11:01:04.073信息[product service,,,]1---[main]com.github.克劳德洛克。蒙哥克。Mongock:com.github.克劳德洛克。蒙哥克。ChangeEntry@e46af677通过2021-05-10 11:01:04.075信息[product service,,,]1---[main]com.github.克劳德洛克。蒙哥克。Mongock:com.github.克劳德洛克。蒙哥克。ChangeEntry@d788b92f传递2021-05-10 11:01:04.077信息[product service,,,,]1---[main]c.a.a.mongock。变更日志。迁移:将组织添加到问题2021-05-10 11:01:04.158信息[product service,,,]1---[main]组织。mongodb。驾驶员连接:打开到dummy-clusterr-39649的连接[connectionId{localValue:17,serverValue:26359725}]。服务器。mongodirector。通讯:27017

共有1个答案

华旭
2023-03-14

您能否提供更多信息,例如您正在使用的mongock版本、日志跟踪(您显示的信息不足以用于诊断)、mongock配置等?

另一方面,应该直接使用MongoTemplate。这是相同的API,你不会错过任何东西。实际上,直接使用MongoTemplate会引发异常。

有关更多信息,请查看Mongock的文档

 类似资料:
  • 我想知道是否有办法在过滤掉elasticsearch文档后更新它们。 假设我有一个包含以下文档的用户集合: 现在我需要做的是更新所有30岁以上用户的名字。查看大量文档并在谷歌上搜索数小时,包括以下文档http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/_updating_documents.html 我找不到办

  • 主要内容:update() 方法,save() 方法在 MongoDB 中,可以使用 update() 和 save() 方法来更新集合中的文档。其中 update() 方法可以更新现有文档中的值,而 save() 方法则可以使用传入文档来替换已有文档。 update() 方法 update() 方法用于更新现有文档中的值,其语法格式如下: db.collection_name.update(     <query>,     <update>,

  • 我正在尝试迁移到AndroidX,以便将素材组件用作按钮、带输出线的textInputLayout等。问题是,如果我没有错,就像官方网站上说的那样,首先我必须下载Android3.2。我已经下载了3.2 Beta 5,然后我将compileSdkVersion从26更新到了28,我添加了依赖实现'com.google.android.Material:Material:1.0.0-beta01',

  • 问题内容: 为什么我的查询不能处理集合中超过100个文档? 错误说: 如果文档<100,则一切正常。 问题答案: 您可能正在执行以下操作: 因此,您要在调用回调之前关闭数据库(尽管在某些情况下它 可以 工作)。 相反,请尝试以下操作:

  • 在我的用例中,我希望使用spring-data-mongo一次更新多个文档,即与查询匹配的文档。 这是我一直在尝试的, MongoDB-3.6 spring-data-mongoDB-1.5.5.release

  • 问题内容: 我想获取更新的文档。这是我的原始代码,它成功更新但没有返回文档。 我使用了toArray函数,但是这给出了错误“没有提供的回调就不能使用writeConcern”: 有任何想法吗? 问题答案: 只会向自己的回调报告受影响的文档数。 要在修改时检索文档,可以改用(以前称为)。 更新:在mongoDB中执行时,请使用;如果使用mongoose,则可以使用。以上是Node.js驱动程序。 注