インデックスとコレクションの管理

MongoTemplate および ReactiveMongoTemplate は、インデックスとコレクションを管理するためのメソッドを提供します。これらのメソッドは、それぞれ IndexOperations または ReactiveIndexOperations と呼ばれるヘルパーインターフェースにまとめられます。これらの操作にアクセスするには、indexOps メソッドを呼び出し、コレクション名またはエンティティの java.lang.Class を渡します (コレクション名は、名前またはアノテーションメタデータのいずれかによって .class から派生します)。

次のリストは、IndexOperations インターフェースを示しています。

  • 命令的

  • リアクティブ

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();

インデックスの作成方法

次の例に示すように、MongoTemplate クラスを使用してコレクションにインデックスを作成し、クエリのパフォーマンスを向上させることができます。

  • 命令的

  • リアクティブ

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 は照合順序の構成をサポートします。

インデックス情報へのアクセス

IndexOperations インターフェースには、IndexInfo オブジェクトのリストを返す getIndexInfo メソッドがあります。このリストには、コレクションに定義されているすべてのインデックスが含まれています。次の例では、age プロパティを持つ Person クラスのインデックスを定義します。

  • 命令的

  • リアクティブ

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());

コレクションを操作するためのメソッド

次の例は、コレクションを作成する方法を示しています。

  • 命令的

  • リアクティブ

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 によるカスタマイズが可能になり、照合順序がサポートされます。
MongoCollections と対話する方法
  • getCollectionNames: コレクション名のセットを返します。

  • collectionExists: 指定された名前のコレクションが存在するかどうかを確認します。

  • createCollection: 上限のないコレクションを作成します。

  • dropCollection: コレクションを削除します。

  • getCollection: コレクションを名前で取得し、存在しない場合は作成します。

時系列

MongoDB 5.0 では、測定やイベントなどの長期にわたるドキュメントを効率的に保存するように最適化された時系列 (英語) コレクションが導入されました。これらのコレクションは、データを挿入する前にそのように作成する必要があります。コレクションは、以下の例に示すように、createCollection コマンドを実行するか、時系列コレクションオプションを定義するか、@TimeSeries アノテーションからオプションを抽出することによって作成できます。

例 1: 時系列コレクションの作成
MongoDB ドライバーを介して時系列を作成する
template.execute(db -> {

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

    db.createCollection("weather", options);
    return "OK";
});
CollectionOptions を使用して時系列コレクションを作成する
template.createCollection("weather", CollectionOptions.timeSeries("timestamp"));
アノテーションから派生した時系列コレクションを作成する
@TimeSeries(collection="weather", timeField = "timestamp")
public class Measurement {

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

template.createCollection(Measurement.class);

上記のスニペットは、まったく同じメソッドを提供するリアクティブ API に簡単に転送できます。返されたパブリッシャーを適切に購読していることを確認してください。