Spring Data MongoDB - 在Mongo集合中以编程方式创建索引应该放在哪里?

25

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

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

但是在程序中,我应该把这段代码放在哪里呢?

在相关存储库的构造函数中吗?我现在是这样做的,它可以工作,但是我感觉这不是一个好的设计。

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


你尝试过在person pojo中的索引字段(name)上添加注释(@Indexed)吗?那个方法对你没用或者可能不是你想要的吗? - s7vr
@Veeram 这不是我要找的。我有两个类似的数据库模型类,其中一个继承另一个,其中一个应该在2个字段上具有复合唯一索引,而另一个只应该在1个字段上具有简单唯一索引。因此,我已经为扩展类放置了@CompoundIndex注释,并且必须通过编程方式为扩展类添加索引。 - Maxim
@Maxim,你找到答案了吗?我也有同样的疑问。 - Nishant Bhardwaz
@NishantBhardwaz 在没有更好的选项的情况下,我刚刚将它放置在存储库的构造函数中。 - Maxim
2个回答

43

如果您需要以编程方式执行此操作,只需创建新的Spring @Configuration并执行此类初始化即可:

如果需要以编程方式实现,可以创建一个新的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)
        );
    }
}

这将是控制器(controller)、服务(service)还是仓库(repository)文件的一部分? - fireball.1
2
这是一个独立的类,将在启动时调用。 - Monicka
2
谢谢Dawid。我发现将其作为MongoRepository<MyObjectType>接口的内部类很方便。 - ozma
1
在这种情况下,我假设注释@DependsOn("mongoTemplate")是不必要的,因为对MongoTemplate的自动装配依赖意味着与该Spring资源的DependsOn关系。 - Daniel Camarda
1
我建议您遵循此答案,这样 @Index 注释就可以在不需要此操作的情况下工作。https://dev59.com/vlQJ5IYBdhLWcg3w05f2#62655088 - Taimoor Ahmad

2
MongoDB支持复合索引,其中一个单独的索引结构可以持有多个字段的引用。
让我们来看一个使用复合索引的快速示例:
@QueryEntity
@Document
@CompoundIndexes({
    @CompoundIndex(name = "email_age", def = "{'email.id' : 1, 'age': 1}")
})
public class User {
    //
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接