【问题标题】:Spring Data MongoDB - Where to create an index programmatically for a Mongo collection?Spring Data MongoDB - 在哪里以编程方式为 Mongo 集合创建索引?
【发布时间】:2018-04-13 19:44:57
【问题描述】:

要为集合创建索引(如本文所述 https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/),可以使用以下内容:

mongoTemplate.indexOps(Person.class).ensureIndex(new Index().on("name",Order.ASCENDING));

但是我应该把这段代码 sn-p 放在程序的什么地方呢?

在相关存储库的构造函数中?我现在已经这样做了,而且效果很好,但我觉得这是一个糟糕的设计。

Mongo 配置中的某个位置?我还没有找到合适的方法来覆盖这里https://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/config/AbstractMongoConfiguration.html

【问题讨论】:

  • 您是否尝试过在人员 pojo 中注释(@Indexed)索引字段(名称)?这对您不起作用,或者可能不是您想要的?
  • @Veeram 这不是我想要的。我有两个类似的 DB 模型类,其中一个扩展了另一个,其中一个应该有一个超过 2 个字段的复合唯一索引,而另一个应该只有一个超过 1 个字段的简单唯一索引。因此,我为扩展类添加了@CompoundIndex 注释,并且必须以编程方式为扩展类添加索引。
  • @Maxim 你找到答案了吗?我也有同样的疑问。
  • @NishantBhardwaz 我刚刚将它放在存储库的构造函数中,没有更好的选择。

标签: java spring mongodb spring-data-mongodb


【解决方案1】:

如果您需要以编程方式进行,您可以创建新的 Spring 的 @Configuration 并执行这样的初始化:

@Configuration
@DependsOn("mongoTemplate")
public class CollectionsConfig {

    @Autowired
    private MongoTemplate mongoTemplate;

    @PostConstruct
    public void initIndexes() {
        mongoTemplate.indexOps("collectionName") // collection name string or .class
            .ensureIndex(
                new Index().on("name", Sort.Direction.ASC)
        );
    }
}

【讨论】:

  • 这将成为控制器、服务或存储库文件的一部分吗?
  • 这是一个单独的类,将在启动时调用。
  • 谢谢大卫。我发现把它作为 MongoRepository 接口的内部类很舒服
  • 我是否正确假设在这种情况下不需要注释 @DependsOn("mongoTemplate"),因为对 MongoTemplate 的自动关联依赖意味着 DependsOn 与该弹簧资源的关系?
  • 我建议遵循这个答案,以便 @Index 注释可以在不需要这个的情况下工作。 stackoverflow.com/a/62655088/11606132
猜你喜欢
  • 2014-02-24
  • 2019-06-04
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多