Index and Collection Management

MongoTemplateReactiveMongoTemplate 提供了用于管理索引和集合的方法。这些方法分别收集到名为 IndexOperationsReactiveIndexOperations 的帮助程序接口中。你可以通过调用 indexOps 方法并传入实体的集合名称或 java.lang.Class 来访问这些操作(集合名称从 .class 派生,通过名称或注释元数据派生)。 以下列表显示了 IndexOperations 接口:

  • Imperative

  • Reactive

public interface IndexOperations {

    String ensureIndex(IndexDefinition indexDefinition);

    void alterIndex(String name, IndexOptions options);

    void dropIndex(String name);

    void dropAllIndexes();

    List<IndexInfo> getIndexInfo();
}
public interface ReactiveIndexOperations {

    Mono<String> ensureIndex(IndexDefinition indexDefinition);

    Mono<Void> alterIndex(String name, IndexOptions options);

    Mono<Void> dropIndex(String name);

    Mono<Void> dropAllIndexes();

    Flux<IndexInfo> getIndexInfo();

Methods for Creating an Index

你可以使用 MongoTemplate 类在集合上创建索引以改进查询性能,如下例所示:

  • Imperative

  • Reactive

template.indexOps(Person.class)
    .ensureIndex(new Index().on("name",Order.ASCENDING));
Mono<String> createIndex = template.indexOps(Person.class)
    .ensureIndex(new Index().on("name",Order.ASCENDING));

ensureIndex 确保为该集合存在指定 IndexDefinition 的索引。

可以利用 IndexDefinitionGeoSpatialIndexTextIndexDefinition 类创建标准、地理空间和文本索引。例如,假设在之前的部分中已定义了 Venue 类,那么你可以声明一个地理空间查询,如下例所示:

template.indexOps(Venue.class)
    .ensureIndex(new GeospatialIndex("location"));

Index 和`GeospatialIndex` 支持collations 配置。

Accessing Index Information

IndexOperations 接口具有 getIndexInfo 方法,返回 IndexInfo 对象列表。此列表包含在集合上定义的所有索引。以下示例在拥有 age 属性的 Person 类上定义了一个索引:

  • Imperative

  • Reactive

template.indexOps(Person.class)
    .ensureIndex(new Index().on("age", Order.DESCENDING).unique());

List<IndexInfo> indexInfoList = template.indexOps(Person.class)
   .getIndexInfo();
Mono<String> ageIndex = template.indexOps(Person.class)
    .ensureIndex(new Index().on("age", Order.DESCENDING).unique());

Flux<IndexInfo> indexInfo = ageIndex.then(template.indexOps(Person.class)
   .getIndexInfo());

Methods for Working with a Collection

以下示例展示了如何创建集合:

  • Imperative

  • Reactive

MongoCollection<Document> collection = null;
if (!template.getCollectionNames().contains("MyNewCollection")) {
    collection = mongoTemplate.createCollection("MyNewCollection");
}
MongoCollection<Document> collection = template.getCollectionNames().collectList()
    .flatMap(collectionNames -> {
        if(!collectionNames.contains("MyNewCollection")) {
            return template.createCollection("MyNewCollection");
        }
        return template.getMongoDatabase().map(db -> db.getCollection("MyNewCollection"));
    });

集合创建允许使用`CollectionOptions` 进行定制,并支持collations

Example 1. Methods to interact with MongoCollections
  • getCollectionNames:返回一组集合名称。

  • collectionExists:检查具有指定名称的集合是否存在。

  • createCollection:创建无限制集合。

  • dropCollection: Drops the collection.

  • getCollection:根据名称获取集合,如果集合不存在,则创建集合。

Time Series

MongoDB 5.0 引入了 Time Series 集合,这些集合经过优化,可以随着时间的推移有效存储文档,例如测量或事件。在插入任何数据之前,需要按此方式创建这些集合。可以通过运行 createCollection 命令、定义时间序列集合选项或从 @TimeSeries 注释中提取选项(如下面的示例所示)来创建集合。

Example 2. Create a Time Series Collection
Create a Time Series via the MongoDB Driver
template.execute(db -> {

    com.mongodb.client.model.CreateCollectionOptions options = new CreateCollectionOptions();
    options.timeSeriesOptions(new TimeSeriesOptions("timestamp"));

    db.createCollection("weather", options);
    return "OK";
});
Create a Time Series Collection with CollectionOptions
template.createCollection("weather", CollectionOptions.timeSeries("timestamp"));
Create a Time Series Collection derived from an Annotation
@TimeSeries(collection="weather", timeField = "timestamp")
public class Measurement {

    String id;
    Instant timestamp;
    // ...
}

template.createCollection(Measurement.class);

上面的代码段可以轻松地转移到反应式 API,提供完全相同的方法。请确保正确 订阅 返回的发布者。