indexOps和@Indexed之间有什么区别

时间:2016-09-26 08:38:29

标签: spring-data spring-data-mongodb

我正在阅读Spring Data MongoDB的文档,我看到两种不同的创建索引的方法:使用indexOps

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

或通过注释@Indexed和其他(@CompoundIndex@GeoSpatialIndexed@TextIndexed

我的问题是:两种方法之间的差异以及我应该如何/何时使用其中一种

1 个答案:

答案 0 :(得分:1)

两种方法(@Indexed().ensureIndex(...))都实现了相同的目标,唯一的区别是一个是声明性的而另一个是必要的。来自documentation

  

@Indexed注释告诉映射框架调用   在文档的该属性上创建createIndex(...),进行搜索   更快。

来自MongoTemplate的代码(具体为DefaultIndexOperations#ensureIndex):

  

collection.createIndex(indexDefinition.getIndexKeys())

一般情况下,我更倾向于使用注释方法,因为它在实体级别上更明显,更具可读性。另一方面,程序化方法可用于不在实体中的字段。例如,在一个项目中,我们有用于搜索的隐藏字段(即小写和连接),需要索引,我们使用java代码创建它们。