ワイルドカード インデックス
MongoDB は、クエリのパフォーマンスを向上させるために、フィールドまたはフィールドのセットにインデックスを作成することをサポートしています。 MongoDB はフレキシブルなスキーマをサポートしているため、ドキュメント フィールド名はコレクション内で異なる場合があります。 ワイルドカードを使用すると、任意のフィールドまたは不明なフィールドに対するクエリをサポートできます。
ワイルドカード インデックスを作成するには、ワイルドカード指定子($**
)をインデックス キーとして使用します。
db.collection.createIndex( { "$**": <sortOrder> } )
ワイルドカード インデックスを作成するには、次のコマンドを使用できます。
ユースケース
ワイルドカード インデックスは、インデックスを作成するフィールドが不明または変更される可能性がある場合にのみ使用してください。ワイルドカード インデックスは、特定のフィールドに対象を絞ったインデックスほどパフォーマンスが良くありません。対象を絞ったインデックスを作成できないような任意のフィールド名がコレクションに含まれている場合は、一貫したフィールド名になるようにスキーマを改造することを検討してください。対象を絞ったインデックスの詳細については、「クエリをサポートするインデックスの作成」を参照してください。
次のシナリオではワイルドカード インデックスの使用を検討してください。
アプリケーションが、ドキュメント間でフィールド名が異なるコレクションをクエリする場合、ワイルドカード インデックスを作成して、可能性のあるすべてのドキュメント フィールド名に対するクエリをサポートします。
アプリケーションが、サブフィールドが一致しない埋め込みドキュメントフィールドに対して繰り返しクエリを実行する場合は、すべてのサブフィールドに対するクエリをサポートするようにワイルドカードを作成します。
アプリケーションが共通の特徴を持つドキュメントをクエリする場合。複合ワイルドカード インデックスは、共通フィールドを持つドキュメントに対する多数のクエリを効率的にカバーできます。詳細については、「複合ワイルドカード インデックス」を参照してください。
はじめる
ワイルドカード インデックスを使用して次のタスクを実行できます。
詳細
ワイルドカード インデックスは次のように動作します。
コレクション内に複数のワイルドカード インデックスを作成できます。
ワイルドカード インデックスは、コレクション内の他のインデックスと同じフィールドをカバーできます。
ワイルドカード インデックスでは、デフォルトで
_id
フィールドが省略されます。_id
フィールドをワイルドカード インデックスに含めるには、{ "_id" : 1 }
を指定してwildcardProjection
ドキュメントに明示的に含める必要があります。ワイルド インデックスはスパース インデックスであるため、インデックス フィールドに null 値が含まれていても、インデックス フィールドを持つドキュメントのエントリのみが含まれます。
ワイルドカード インデックスは、ワイルドカード テキスト インデックスとは区別され、互換性もありません。ワイルドカード インデックスは
$text
演算子を使用するクエリをサポートしていません。
カバード クエリ
ワイルドカード インデックスは、次の条件がすべて当てはまる場合にのみ、カバード クエリをサポートできます。
クエリ プランナーが、クエリ述語を満たすワイルドカード インデックスを選択する
クエリ述語が、ワイルドカード インデックスの対象となるフィールドを 1 つだけ指定している
クエリ プロジェクションが、
_id
を明示的に除外し、クエリ フィールドのみを含めている指定されたクエリ フィールドは配列ではない
employees
コレクションの次のワイルドカード インデックスを検討します。
db.employees.createIndex( { "$**" : 1 } )
次の操作では、1 つのフィールド lastName
をクエリし、結果のドキュメントから他のすべてのフィールドをプロジェクトします。
db.employees.find( { "lastName" : "Doe" }, { "_id" : 0, "lastName" : 1 } )
指定された lastName
が配列でない場合、MongoDB は $**
ワイルドカードを使ってカバード クエリをサポートできます。
詳細
ワイルドカード インデックスの詳細については、以下を参照してください。