ワイルドカード インデックスの制限
項目一覧
このページでは、互換性のないプロパティやサポートされていないクエリ パターンなど、ワイルドカード インデックスの制限について説明します。
複合ワイルドカード インデックスの制限
複合ワイルドカード インデックスには次の制限があります。
複合ワイルドカード インデックスには、ワイルドカードタームを 1 つだけ含めることができます。
たとえば、次のインデックスは指定できません。
{ userID: 1, "object1.$**": 1, "object2.$**": 1 } compound wildcard index
内の非ワイルドカード タームは単一のキー タームである必要があります。 マルチキーインデックス タームは許可されていません。wildcardProjection
オプションは、ワイルドカード フィールドが$**
の場合にのみ有効です。 ワイルドカード インデックス タームにフィールドパスを指定する場合、wildcardProjection
は使用できません。これは有効な定義です。
{ key: { "$**": 1 }, name: "index_all_with_projection", wildcardProjection: { "someFields.name": 1, "otherFields.values": 1 } } これは無効な定義です。
{ key: { "someFields.$**": 1 }, name: "invalid_index", wildcardProjection: { "someFields.name": 1, "otherFields.values": 1 } } _id
フィールドはデフォルトで省略されています。_id
フィールドが必要な場合:ワイルドカード インデックスの指定
$**
を使用する
wildcardProjection
_id
フィールドを指定する
db.studentGrades.createIndex( { "$**": 1, }, { wildcardProjection: { _id: 1, exams: 1, extraCredit: 1 } } ) ワイルドカード フィールドと通常のフィールドに同じフィールドを含めることはできません。 ワイルドカード パターンからフィールドを除外するには、
wildcardProjection
を使用します。db.studentGrades.createIndex( { exams: 1, "$**": 1, homeworks: 1 }, { wildcardProjection: { exams: 0, homeworks: 0 } } )
互換性のないインデックス プロパティ
ワイルドカード インデックスに次のプロパティを指定することはできません。
互換性のないインデックス タイプ
ワイルドカード構文を使用して次のインデックス タイプを作成することはできません( $.**
)。
注意
曖昧さ回避
ワイルドカード インデックスは とは区別され、 自己管理型配置でのワイルドカード テキスト インデックスの作成と互換性がありません。 ワイルドカード インデックスは$text
演算子を使用するクエリをサポートしていません。
シャードキー
ワイルドカード インデックスをシャードキー インデックスとして使用することはできません。
サポートされていないクエリパターン
ワイルドカード インデックスは次のクエリ パターンをサポートしていません。
配列フィールドは と等しくない null
特定のフィールドがコレクション内のいずれかのドキュメントの配列である場合、ワイルドカード インデックスはそのフィールドがnull
と等しくないドキュメントのクエリをサポートできません。
たとえば、 product_attributes
のワイルドカード インデックスを持つinventory
コレクションを考えてみましょう。 product_attributes.tags
がコレクション内のいずれかのドキュメントの配列である場合、ワイルドカード インデックスは次のクエリをサポートできません。
db.inventory.find( { $ne : [ "product_attributes.tags", null ] } ) db.inventory.aggregate( [ { $match : { $ne : [ "product_attributes.tags", null ] } } ] )
ドキュメントと配列の等価一致
ワイルドカード インデックスは、ドキュメントまたは配列自体ではなく、ドキュメントまたは配列の内容のエントリを保存します。 そのため、ワイルドカード インデックスはドキュメントまたは配列の完全な等価一致をサポートできません。
たとえば、 product_attributes
のワイルドカード インデックスを持つinventory
コレクションを考えてみましょう。 ワイルドカード インデックスは次のクエリをサポートしていません。
db.inventory.find( { "product_attributes" : { "price" : 29.99 } } ) db.inventory.find( { "product_attributes.tags" : [ "waterproof", "fireproof" ] } )
注意
ワイルドカード インデックスは、フィールドが空のドキュメント{}
と等しいクエリをサポートできます。
同様に、ワイルドカード インデックスはドキュメントと配列の完全な不等価一致をサポートしていません。 たとえば、 product_attributes
のワイルドカード インデックスでは次のクエリをサポートできません。
db.inventory.aggregate( [ { $match : { $ne : [ "product_attributes", { "price" : 29.99 } ] } } ] ) db.inventory.aggregate( [ { $match : { $ne : [ "product_attributes.tags", [ "waterproof", "fireproof" ] ] } } ] )
フィールドが存在しない
ワイルドカード インデックスはスパースで、空のフィールドにはインデックスを作成しません。 Therefore, wildcard indexes cannot support queries for documents where a field does not exist.
たとえば、 product_attributes
のワイルドカード インデックスを持つinventory
コレクションを考えてみましょう。 ワイルドカード インデックスは次のクエリをサポートしていません。
db.inventory.find( { "product_attributes" : { $exists : false } } ) db.inventory.aggregate( [ { $match : { "product_attributes" : { $exists : false } } } ] )
マルチフィールドクエリ述語
ワイルドカード インデックスは、最大1 つのクエリ述語フィールドをサポートできます。 つまり、次のことを意味します。
MongoDB では、非ワイルドカード インデックスを使用してクエリ述語の一部をサポートし、ワイルドカード インデックスを使用して別の部分をサポートすることはできません。
MongoDB では、同じクエリ内で異なる述語をサポートするために複数のワイルドカード インデックスを使用することはできません。
1 つのワイルドカード インデックスが複数のクエリ フィールドをサポートできる場合、MongoDB は、クエリ フィールドの 1 つをサポートするためにワイルドカード インデックスのみを使用できます。 MongoDB は、関連するワイルドカード インデックス パスに基づいて、ワイルドカード インデックスでサポートするフィールドを自動的に選択します。
たとえば、 product_attributes
のワイルドカード インデックスを持つinventory
コレクションを考えてみましょう。 ワイルドカード インデックスは、次のクエリのすべての述語をサポートすることはできません。
db.inventory.find( { "product_attributes.price": { $gt: 20 }, "product_attributes.material": "silk", "product_attributes.size": "large" } )
代わりに、MongoDB は ワイルドカード インデックスを使用してクエリ述語の 1 つだけをサポートします。 MongoDB は、関連するワイルドカード インデックス パスに基づいて、どの述語をサポートするかを選択します。 サポートされていないクエリ述語は、rejectedPlans
explain 結果 の に表示されます。
ソートを含むクエリ
MongoDB では、次のすべてが当てはまる 場合にのみsort()
、 を満たすためにワイルドカード インデックスを使用できます。
クエリ プランナーが、クエリ述語を満たすワイルドカード インデックスを選択する
sort()
はクエリ述語フィールドのみを指定します。指定されたフィールドは配列ではない
上記の条件が満たされない場合、MongoDB はソートにワイルドカード インデックスを使用できません。 MongoDB は、クエリ述語とは異なるインデックスを必要とするsort()
操作をサポートしていません。
products
コレクションの次のワイルドカード インデックスを検討します。
db.products.createIndex( { "product_attributes.$**" : 1 } )
次の操作では、単一のフィールドproduct_attributes.price
をクエリし、その同じフィールドでソートします。
db.products.find( { "product_attributes.price" : { $gt : 10.00 } }, ).sort( { "product_attributes.price" : 1 } )
指定されたprice
が配列ではないことを前提とすると、MongoDB はproduct_attributes.$**
ワイルドカード インデックスを使用してfind()
とsort()
の両方を満たすことができます。