数据库

Spring data mongo index

2018-07-17  本文已影响1007人  金刚_30bf

索引和集合管理

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;
}
上一篇下一篇

猜你喜欢

热点阅读