AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

クエリ最適化のインデックス

このガイドでは、MongoDB Extension for Hibernate ORMを使用して、エンティティ上で単一フィールド、複合、およびユニークインデックスを宣言する方法を学びます。Hibernate ORM拡張機能は、スキーマ生成を有効にすると、エンティティで宣言したインデックスとユニーク制約をMongoDBのインデックス操作に変換します。

エンティティで宣言されたインデックスと一意の制約を作成するには、アプリケーションの構成でスキーマ生成を有効にします。create または create-drop アクションを使用して、スキーマ生成を有効にできます。

  • create: SessionFactory が閉じるときにスキーマオブジェクトを削除せずに作成します。

  • create-dropSessionFactoryが開くときにスキーマオブジェクトを作成し、閉じるときに削除します。

警告

create-drop アクションは、開発およびテストを目的としています。本番データを保持する必要がある場合は使用しないでください。

Spring Boot を使用している場合は、お使いの application.properties ファイルに次のプロパティを追加してください。

spring.jpa.properties.jakarta.persistence.schema-generation.database.action=create-drop

Jakarta Persistence を直接構成する場合は、次のプロパティを persistence.xml ファイルに追加します。

<property name="jakarta.persistence.schema-generation.database.action" value="create-drop"/>

あるいは、hibernate.properties ファイルでプロパティを設定することもできます。

jakarta.persistence.schema-generation.database.action=create-drop

スキーマ生成が実行されると、Hibernate ORM拡張機能はコレクションを作成し、エンティティで宣言されたインデックスと一意の制約に対してMongoDB createIndexesコマンドを発行します。

このガイドの例では、次の Movie エンティティの @Table アノテーションに @Index および @UniqueConstraint アノテーションを追加することで、インデックスと一意制約を宣言しています。

@Entity@Table(name = "movies")public class Movie { @Id @ObjectIdGenerator private ObjectId id; private String title; private String plot; private int year; private List<String> cast; private List<String> directors; public Movie(String title, String plot, int year, List<String> cast, List<String> directors) { this.title = title; this.plot = plot; this.year = year; this.cast = cast; this.directors = directors; } public Movie() { } // Getter and setter methods}

単一フィールドインデックスは、コレクションのドキュメント内の単一フィールドへの参照を持つインデックスです。これらは、単一フィールドのクエリとソートのパフォーマンスを向上させます。

次の例では、year フィールドに降順で単一フィールドインデックスを作成します。

@Table( name = "movies", indexes = { @Index(name = "idx_year", columnList = "year desc") })

columnList をフィールド名に設定し、asc または desc を追加して方向を指定します。方向を省略した場合、MongoDBは昇順のインデックスを作成します。name 要素は、MongoDBインデックスの名前を指定します。

詳細については、MongoDB Server マニュアルの「 単一フィールド インデックス 」を参照してください。

複合インデックスは、コレクションのドキュメント内の複数のフィールドへの参照を保持し、クエリとソートのパフォーマンスを向上させます。

次の例では、title フィールドと year フィールドに降順で複合インデックスを作成します。

@Table( name = "movies", indexes = { @Index(name = "idx_title_year", columnList = "title desc,year desc") })

columnList のフィールドの順序によって、MongoDB がインデックス キーをソートする順序が決まります。これにより、インデックスがサポートできるクエリ プレフィックスが変わります。例えば、title の後に year が続くインデックスは title のみに一致するクエリをサポートできますが、year のインデックスは title のみに一致するクエリには役立ちません。

詳細については、 マニュアルの「 複合インデックス MongoDB Server」を参照してください。

ユニークインデックスにより、インデックス フィールドに重複する値が格納されなくなります。

@Index または @UniqueConstraint アノテーションを使用して、ユニークインデックスを作成できます。

  • フィールドの方向などのインデックスオプションを指定する必要がある場合は、@Index(unique = true)を使用します。

  • テーブルレベルの制約モデルを使用する場合は、@UniqueConstraint を使用します。columnNames のフィールドはキーの順序を定義し、@UniqueConstraint はフィールドの方向を指定しないため、結果として得られるユニークインデックスは昇順になります。

次の例では、title フィールドにユニークインデックスを作成します。

@Table( name = "movies", indexes = { @Index(name = "idx_title", columnList = "title", unique = true) })

次の例では、title フィールドと plot フィールドにユニーク制約を作成します。

@Table( name = "movies", uniqueConstraints = { @UniqueConstraint(name = "uk_title_plot", columnNames = {"title", "plot"}) })

MongoDB は、インデックス付きフィールドの null または欠落している値をインデックス付き値として扱います。ユニーク制約により、単一フィールドのユニークインデックスは、インデックスエントリに null 値を含むドキュメントを 1 つしか含めることができません。

重要

ユニークインデックスの作成が失敗する可能性がある

コレクションにこれらのフィールドの重複値を持つドキュメントが既に含まれている場合、MongoDBは指定されたフィールドにユニークインデックスを作成できません。ユニークインデックスを作成する前に、既存のデータに重複した値がないか検討してください。

詳細については、MongoDB Serverマニュアルのユニークインデックスを参照してください。

エンティティの作成と埋め込みデータのマッピングの詳細については、「コレクションを表すエンティティの作成」ガイドを参照してください。

エンティティを使用してデータベース操作を実行する方法を学ぶには、「CRUD 操作の実行」および「クエリの指定」ガイドを参照してください。

Hibernate ORM拡張機能がサポートするインデックスタイプの一覧を表示するには、機能互換性ページを参照してください。

このガイドで使用されているJakarta Persistenceアノテーションの詳細を学ぶには、Jakarta Persistence APIのドキュメントを参照してください。