インデックスとコレクションの管理
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 のインデックスがコレクションに存在することを確認します。
IndexDefinition
、GeoSpatialIndex
、TextIndexDefinition
クラスを使用して、標準インデックス、地理空間インデックス、テキストインデックスを作成できます。例: 前のセクションで定義した 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
アノテーションからオプションを抽出することによって作成できます。
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 に簡単に転送できます。返されたパブリッシャーを適切に購読していることを確認してください。