Overview
このガイドでは、FS コア プロバイダーでインデックスを定義する方法を学びます。インデックスはクエリの効率を向上させ、ドキュメントのクエリと保存に機能を追加します。
インデックスがないと、 MongoDB はコレクション内のすべてのドキュメントをスキャンして 、各クエリに一致するドキュメントを見つける必要があります。これらのコレクションスキャンは遅く、アプリケーションのパフォーマンスに悪影響を与える可能性があります。ただし、クエリを カバー するインデックスを作成すると、 MongoDB はそのインデックスを使用して検査する必要があるドキュメントを制限できます。
クエリのパフォーマンスを向上させるには、ソートされた結果を返すアプリケーションのクエリや操作で頻繁に表示されるフィールドにインデックスをビルドします。追加する各インデックスはアクティブな場合にディスク領域とメモリを消費するため、キャパシティープランニングとしてインデックスメモリとディスク使用量を追跡することをお勧めします。
インデックスの作成
FS コア プロバイダーは次のタイプのインデックスをサポートしています。
このガイドの例では、クイック スタートガイドで作成されたサンプルアプリケーションを使用します。クイック スタートアプリケーションを設定 したら、次の例に示すように、PlanetDbContext
の OnModelCreating()
メソッドにコードを追加することで、このガイドの例を実行できます。
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // Paste example code here }
注意
FS コア プロバイダーは、dbContext.Database.EnsureCreated()
メソッドを呼び出すとインデックスを作成します。インデックスが作成された後、 プロバイダーを使用してインデックスを変更または削除することはできません。アプリケーション内のインデックスを変更または削除する必要がある場合は、 .NET/ C#ドライバーを直接使用する必要があります。
ドライバーでのインデックス操作の詳細については、 .NET/ C#ドライバーのドキュメントの「 インデックスガイド 」を参照してください。
次のセクションでは、前述の各タイプのインデックスを作成する方法を示します。
単一フィールド インデックス
単一フィールド インデックス は、コレクションのドキュメント内の単一のフィールドを参照インデックスです。単一フィールドのクエリとソートのパフォーマンスが向上します。_id_
インデックスは、単一フィールドインデックスの例です。
インデックスをインデックスフィールドを指定するLambda式を使用して HasIndex()
メソッドを呼び出すことで、単一フィールドインデックスを作成できます。 次の例では、Planet
エンティティに 単一フィールドインデックスを作成します。
modelBuilder.Entity<Planet>(p => { p.HasIndex(p => p.orderFromSun); p.ToCollection("planets"); });
複合インデックス
複合インデックス は、コレクションのドキュメント内の複数のフィールドをカバーするインデックスです。これらのインデックスにより、マルチフィールドのクエリとソートのパフォーマンスが向上します。
インデックスをインデックスフィールドを指定するLambda式を使用して HasIndex()
メソッドを呼び出すことで、複合インデックスを作成できます。 次の例では、Planet
エンティティに複合インデックスを作成しています。
modelBuilder.Entity<Planet>(p => { p.HasIndex(p => new { p.orderFromSun, p.name }); p.ToCollection("planets"); });
ユニークインデックス
一意なインデックス により、複数のドキュメントでインデックスフィールドに同じ値が含まれないようになります。デフォルトでは 、 MongoDB はコレクションの作成 中に _id
フィールドにユニークインデックスを作成します。このインデックスを変更または削除することはできません。
前述のセクションに示すように、HasIndex()
メソッドを使用してインデックスを作成し、IsUnique()
メソッドを連鎖させることで、ユニークインデックスを作成できます。次の例では、Planet
エンティティにユニークインデックスを作成しています。
modelBuilder.Entity<Planet>(p => { p.HasIndex(p => p.orderFromSun).IsUnique(); p.ToCollection("planets"); });
インデックス オプション
インデックスの作成時にオプションを指定して、インデックス名、プロパティ、またはインデックスのタイプをカスタマイズできます。次のセクションでは、指定できるオプションの一部について説明します。
名前付きインデックス
デフォルトでは 、 MongoDB はインデックスのフィールドとオプションに基づいて、生成された名前でインデックスを作成します。インデックスのカスタム名を指定するには、インデックスを作成するときに名前を string として渡します。次の例では、Planet
エンティティに "named_order"
という名前の複合インデックスを作成します。
modelBuilder.Entity<Planet>(p => { p.HasIndex(p => new { p.orderFromSun, p.name }, "named_order"); p.ToCollection("planets"); });
インデックスの順序
デフォルトでは 、 MongoDB は昇順でインデックスを作成します。新しいインデックスを作成するときに IsDescending()
メソッドを呼び出して、降順でインデックスを作成できます。次の例では、Planet
エンティティに降順のインデックスを作成しています。
modelBuilder.Entity<Planet>(p => { p.HasIndex(p => p.orderFromSun).IsDescending(); p.ToCollection("planets"); });
注意
降順の単一フィールドインデックスを使用すると、インデックスのパフォーマンスに悪影響が影響可能性があります。最高のパフォーマンスを得るには、昇順のインデックスのみを使用してください。
MongoDB固有のオプション
インデックスを作成するときに、HasCreateIndexOptions()
メソッドを使用し、 .NET/ C#ドライバーの CreateIndexOptions
クラスのインスタンスを渡すことで、追加のMongoDB固有のオプションを指定できます。CreateIndexOptions
クラスがサポートするオプションを任意に渡すことができます。サポートされているオプションの詳細については、CreateIndexOptions APIドキュメント を参照してください。
次の例では、インデックスを作成し、Sparse
オプションを指定して スパースインデックスを作成します。
modelBuilder.Entity<Planet>(p => { p.HasIndex(p => p.orderFromSun) .HasCreateIndexOptions(new CreateIndexOptions() { Sparse = true }); p.ToCollection("planets"); });
詳細情報
MongoDBのインデックスの詳細については、 MongoDB Serverマニュアルの「 インデックスガイド 」を参照してください。