Overview
このガイドでは、Dpango モデルを使用してMongoDBインデックスを作成する方法を学習できます。インデックスはクエリの効率を向上させ、クエリとドキュメントストレージの追加機能を提供します。
インデックスがないと、 MongoDB はコレクション内のすべてのドキュメントをスキャンして 、クエリに一致するドキュメントを見つける必要があります。 これらのコレクションスキャンは遅く、アプリケーションのパフォーマンスに悪影響を与える可能性があります。 ただし、クエリに適切なインデックスがある場合、 MongoDB はそのインデックスを使用して検査するドキュメントを制限できます。
Dlango は、モデルにインデックスを作成するために使用できる Index
クラスを提供します。 Dlango MongoDBバックエンドは、モデルが表すMongoDBコレクションに同じインデックスを作成します。
Tip
Index
Index
クラスの詳細については、Diango ドキュメントの を参照してください。
サンプル データ
このガイドの例では、nutrition
フィールドの値として埋め込み Nutrition
モデルを含む Recipe
モデルを使用します。 これらのモデル クラスには、次の定義があります。
from django.db import models from django.db.models import Q, F from django_mongodb_backend.models import EmbeddedModel from django_mongodb_backend.fields import EmbeddedModelField, ArrayField class Nutrition(EmbeddedModel): calories = models.IntegerField(default=0) carb_grams = models.IntegerField(default=0) protein_grams = models.IntegerField(default=0) class Recipe(models.Model): title = models.CharField(max_length=200) cuisine = models.CharField(max_length=200) cook_time = models.IntegerField(default=0) allergens = ArrayField(models.CharField(max_length=100), null=True, blank=True) nutrition = EmbeddedModelField(Nutrition, null=True, blank=True) class Meta: db_table = "recipes" def __str__(self): return self.title
Recipe
モデルの Meta
クラスでは、db_table = "recipes"
オプションは、Recipe
モデルを recipes
と呼ばれるMongoDBコレクションにマッピングするように Diango MongoDBバックエンドに指示します。モデルを使用してMongoDBコレクションを操作する Djangoアプリケーションを作成する方法については、「を使い始める」チュートリアルをご覧ください。
インデックスの作成
モデルにインデックスを作成するには、モデルの Meta
クラスで indexes
オプションを指定します。 この indexes
オプションの値を、次のコードに示すように、作成するインデックスのリストに設定します。
class Meta: indexes = [ models.Index(<first index definition>), models.Index(<second index definition>), # add more indexes here ]
インデックスを定義するには、次の引数を models.Index()
メソッドに渡します。
fields
:インデックスを作成するフィールドのリストを指定します。 この引数は必須です。name
:インデックス名を指定します。 この引数は任意であり、指定しない場合は Diango がインデックス名を自動的に作成します。condition
:インデックスを作成するドキュメントのサブセットを指定します。 この引数は任意です。condition
引数の詳細については、このガイドの「 部分インデックス 」セクションを参照してください。
データベース移行を適用すると、Diango MongoDBバックエンドはMongoDBコレクションに同じインデックスを作成します。
Tip
データベース移行を作成して適用する方法については、Dpango ドキュメントの「 移行 」を参照してください。
このセクションでは、次のインデックスタイプの作成方法を説明します。
単一フィールド インデックス
単一フィールドインデックスは、コレクション内の単一フィールドからの情報を保存します。 デフォルトでは 、すべてのMongoDBコレクションには _id
フィールドのインデックスがあります。
次の例では、 Recipe
モデルの Meta
クラスを更新して title
フィールドに単一のフィールドインデックスを作成します。これによりMongoDBバックエンドは recipes
コレクションに作成します。
class Meta: db_table = "recipes" indexes = [ models.Index(fields=["title"], name="title_idx"), ]
あるいは、次のコードに示すように、モデルの title
フィールドに db_index
オプションを設定して、インデックスを作成することもできます。
class Recipe(models.Model): title = models.CharField(max_length=200, db_index=True)
複合インデックス
複合インデックスは、コレクション内の複数のフィールドからデータを収集してソートします。 MongoDB は、インデックスで指定された最初のフィールドごとにデータをグループ化し、その後は後続のフィールドごとにデータをグループ化します。
次の例では、 Recipe
モデルの Meta
クラスを更新して title
フィールドと cook_time
フィールドに複合インデックスを作成します。これによりMongoDBバックエンドは recipes
コレクションに作成します。
class Meta: db_table = "recipes" indexes = [ models.Index(fields=["title", "cook_time"]), ]
Multikey Index
マルチキー インデックスは、配列フィールドからデータを収集してソートします。 配列フィールドにインデックスを作成すると、 MongoDB は自動的にそのインデックスをマルチキーインデックスとして設定します。
次の例では、 Recipe
モデルの Meta
クラスを更新して allergens
配列フィールドに複合インデックスを作成します。これによりMongoDBバックエンドは recipes
コレクションに作成します。
class Meta: db_table = "recipes" indexes = [ models.Index(fields=["allergens"], name="allergy_idx"), ]
埋め込みドキュメントインデックス
埋め込みモデル値を保存するフィールドにインデックスを作成できます。埋め込みドキュメントとしてMongoDB は埋め込みドキュメントとして表現します。
次の例では、 Recipe
モデルの Meta
クラスを更新して nutrition
埋め込みモデルフィールドにインデックスを作成します。このMongoDBは recipes
コレクションに作成されます。
class Meta: db_table = "recipes" indexes = [ models.Index(fields=["nutrition"]), ]
重要
前の例で作成されたインデックスは、埋め込みドキュメント全体を指定するクエリでのみ使用されます。 埋め込みドキュメント内の特定のフィールドに対するクエリでは、インデックスは使用されません。 ただし、内部 Meta
クラスを Nutrition
モデルに追加し、indexes
オプションを指定することで、埋め込みドキュメント内のフィールドにインデックスことができます。
高度なインデックス構成
このセクションでは、次の高度なインデックスタイプの作成方法を説明します。
部分インデックス
部分インデックスでは、コレクション内の指定フィルター条件を満たすドキュメントのみがインデックス、ストレージ使用量とパフォーマンスのコストが削減されます。
部分インデックスを作成するには、condition
引数を models.Index()
メソッドに渡します。 条件値をフィルター条件を含む Q
オブジェクトに設定します。 condition
引数を使用する場合は、name
引数も models.Index()
に渡す必要があります。
Tip
Q
Q
オブジェクトの詳細については、Diango ドキュメントの を参照してください。
次の例では、 Recipe
モデルの Meta
クラスを更新して cuisine
フィールドに部分インデックスを作成し、Diango MongoDBバックエンドに cook_time
の値が 30
より小さいドキュメントのみをインデックスに指示します。
class Meta: db_table = "recipes" indexes = [ models.Index(fields=["cuisine"], condition=Q(cook_time__lt=30), name="fast_cuisine_idx"), ]
Unique Indexes
一意なインデックス により、インデックス フィールドに重複する値が保存されるのを防ぐことができます。 単一のフィールドでは、一意のインデックスにより、指定されたフィールドに値が最大 1 回表示されるようになります。 複数のフィールドでは、一意なインデックス により、インデックスキー値の任意の組み合わせが最大 1 回表示されるようになります。
単一フィールドの例
次の例では、 Recipe
モデルの cuisine
フィールド を更新し、unique
オプションを True
に設定して一意の単一フィールドインデックスを作成します。
cuisine = models.CharField(max_length=200, unique=True)
注意
unique
オプションを True
に設定すると、指定されたフィールドにインデックスが自動的に作成されます。
複合例
次の例では、 Recipe
モデルの Meta
クラスを更新して、title
フィールドと cuisine
フィールドに複合インデックスを作成します。 このコードでは、constraints
オプションを UniqueConstraint
インスタンスに設定し、次のフィールドに一意の複合インデックスを作成します。
class Meta: db_table = "recipes" constraints = [ models.UniqueConstraint(fields=["title", "cuisine"], name="unique_regional_meal"), ]
Tip
constraints
オプションをUniqueConstraint
に設定すると、指定されたフィールドにインデックスが自動的に作成されます。Meta
クラスのconstraint
オプションの詳細については、Dmango ドキュメントの「 制約 」を参照してください。
詳細情報
このガイドで言及されているインデックスの種類の詳細については、次のMongoDB Serverマニュアル リソースを参照してください。
Dlango モデルでのインデックス作成の詳細については、Diango ドキュメントのIndex
を参照してください。