Spring data mongo index
索引和集合管理
MongoTemplate 提供很多方法来管理索引和集合。
这些方法被放到了一个helper类中, 称为 IndexOperations。
可以调用indexOps 访问这些操作,传入集合名 或 entity 类名。
该接口有如下操作:
public interface IndexOperations {
void ensureIndex(IndexDefinition indexDefinition);
void dropIndex(String name);
void dropAllIndexes();
void resetIndexCache();
List<IndexInfo> getIndexInfo();
}
创建索引
mongoTemplate.indexOps(Person.class).ensureIndex(new Index().on("name",Order.ASCENDING));
ensureIndex 确保该集合上存在该索引。
您可以使用IndexDefinition,GeoSpatialIndex和TextIndexDefinition类创建标准,地理空间和文本索引。
mongoTemplate.indexOps(Venue.class).ensureIndex(new GeospatialIndex("location"));
获取索引信息
IndexOperations 接口有方法getIndexInfo 会返回IndexInfo的列表。 该列表包括集合上定义的所有的index 。
template.indexOps(Person.class).ensureIndex(new Index().on("age", Order.DESCENDING).unique(Duplicates.DROP));
List<IndexInfo> indexInfoList = template.indexOps(Person.class).getIndexInfo();
// Contains
// [IndexInfo [fieldSpec={_id=ASCENDING}, name=_id_, unique=false, dropDuplicates=false, sparse=false],
// IndexInfo [fieldSpec={age=DESCENDING}, name=age_-1, unique=true, dropDuplicates=true, sparse=false]]
管理集合
MongoCollection<Document> collection = null;
if (!mongoTemplate.getCollectionNames().contains("MyNewCollection")) {
collection = mongoTemplate.createCollection("MyNewCollection");
}
mongoTemplate.dropCollection("MyNewCollection");
getCollectionNames: Returns a set of collection names.
collectionExists: Checks to see if a collection with a given name exists.
createCollection: Creates an uncapped collection.
dropCollection: Drops the collection.
getCollection: Gets a collection by name, creating it if it does not exist.
索引注解
@Indexed: Applied at the field level to describe how to index the field.
@CompoundIndex: Applied at the type level to declare Compound Indexes
@GeoSpatialIndexed: Applied at the field level to describe how to geoindex the field.
@TextIndexed: Applied at the field level to mark the field to be included in the text index.
例子:
@Document
@CompoundIndexes({
@CompoundIndex(name = "age_idx", def = "{'lastName': 1, 'age': -1}")
})
public class Person<T extends Address> {
@Id
private String id;
@Indexed(unique = true)
private Integer ssn;
@Field("fName")
private String firstName;
@Indexed
private String lastName;
private Integer age;
@Transient
private Integer accountTotal;
@DBRef
private List<Account> accounts;
}
组合索引 Compound Indexes
组合索引定义在类上。
例子: 定义了一个组合索引 ,lastname升序 ,age降序。
@Document
@CompoundIndexes({
@CompoundIndex(name = "age_idx", def = "{'lastName': 1, 'age': -1}")
})
public class Person {
文本索引
mongodb v.2.4默认禁用文本索引功能。
文本索引只有一个, 所有的注解TextIndexed 的字段都会组合到一个文本索引中。
可以对属性进行加权以影响排名结果的文档分数。 文本索引的默认语言是英语。 要更改默认语言,请将语言属性设置为您想要的任何语言(例如,@ Document(language =“spanish”))。 使用名为language或@Language的属性可以在每个文档库上定义语言覆盖。 以下示例显示如何创建文本索引并将语言设置为西班牙语:
@Document(language = "spanish")
class SomeEntity {
@TextIndexed String foo;
@Language String lang;
Nested nested;
}
class Nested {
@TextIndexed(weight=5) String bar;
String roo;
}