禁用自动索引创建但保留 @Indexed 注释的效果

Effect of disabling auto-index-creation but retaining @Indexed annotations

根据 https://github.com/spring-projects/spring-data-mongodb/issues/3049 在 Spring 数据 MongoDb 中自动创建索引现已弃用并默认禁用。但是,我们希望在代码中保留 @Indexed 注释,仅用于文档目的。

如果我们要跳过从 @Document 注释的 类 中删除所有 @Indexed@CompoundIndexes 注释(即只留下它们),同时允许默认值禁用自动索引创建行为(或显式设置 spring.data.mongodb.auto-index-creation = false)这是否与完全从代码中删除所有 @Indexed@CompoundIndexes 注释具有相同的效果?

我担心在代码中保留这些注释可能会继续产生副作用 and/or 导致与自动索引创建无关的错误。或者这些注释专门用于支持自动索引创建?

以下适用于Spring引导2.5.2和Spring数据Mongo3.2.2.

TL;DR;

如果设置了 spring.data.mongodb.auto-index-creation=false,则不会自动创建任何索引,并且像 @Indexed 这样的注释不会对您的 mongo 集合产生影响。另一方面,它们仍然允许在运行时以编程方式使用 MongoPersistentEntityIndexResolver 从实体收集这些索引信息。

详细演练

设置时spring.data.mongodb.auto-index-creation=false

  • 该设置将从 MongoProperties 通过 MongoDataConfiguration 传播到 MongoMappingContext bean,在那里它作为 MongoMappingContext#isAutoIndexCreation
  • 可用
  • 然后在 MongoTemplate(和 ReactiveMongoTemplate)的构造函数中对其进行评估,以确定新创建的 (Reactive)MongoTemplate 是否应该分配 MongoPersistentEntityIndexCreator 的实例,或者不是
  • 如果在 MongoTemplate 的构造过程中创建了 MongoPersistentEntityIndexCreator 的实例,索引创建逻辑将启动 MongoPersistentEntityIndexCreator[=54= 的对象创建(构造函数) ]

参考资料

  • org.springframework.boot.autoconfigure.mongo.MongoProperties#isAutoIndexCreation
  • org.springframework.boot.autoconfigure.data.mongo.MongoDataConfiguration#mongoMappingContext
  • org.springframework.data.mongodb.core.mapping.MongoMappingContext#isAutoIndexCreation
  • org.springframework.data.mongodb.core.MongoTemplate#MongoTemplate
  • org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator#MongoPersistentEntityIndexCreator