このページでは、互換性のないプロパティやサポートされていないクエリ パターンなど、ワイルドカード インデックスの制限について説明します。
複合ワイルドカード インデックスの制限
複合ワイルドカード インデックスには次の制限があります。
複合ワイルドカード インデックスには、ワイルドカードタームを 1 つだけ含めることができます。
たとえば、次のインデックスは指定できません。
{ userID: 1, "object1.$**": 1, "object2.$**": 1 } 複合ワイルドカード内の非ワイルドカード 期間は、単一のキー 期間である必要があります。マルチキーインデックスタームは許可されていません。
ワイルドカードフィールドが
$**の場合にのみ、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フィールドが必要な場合:ワイルドカードを
$**として指定します。_id: 1を使用して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 } } )
wildcardプロジェクション検証ルール
MongoDB8.3 (および8.2.4 、 、.8.0.18 7.029以降では、無効な構成を防止するために、より厳格な検証ルールが複合ワイルドカード インデックスのwildcardProjection に適用されます。
新しい検証要件を満たさない既存のインデックスは引き続き機能しますが、これらの要件を満たさない新しいインデックスを作成することはできません。
複合ワイルドカード インデックスで wildcardProjection を使用する場合、次のルールが適用されます。
ルール | 有効な例 | 無効な例 | ||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| | | ||||||||||||||||||||||
包含または除外フィールドが | | | ||||||||||||||||||||||
| | | ||||||||||||||||||||||
通常のインデックスフィールドも | | | ||||||||||||||||||||||
| | |
互換性のないインデックス プロパティ
ワイルドカード インデックスに次のプロパティを指定することはできません。
互換性のないインデックス タイプ
ワイルドカード構文を使用して次のインデックス タイプを作成することはできません( $.** )。
注意
曖昧さ回避
ワイルドカード インデックスは とは区別され、 自己管理型配置でのワイルドカード テキスト インデックスの作成と互換性がありません。 ワイルドカード インデックスは$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 は、クエリ フィールドの 1 つをサポートするためにワイルドカードのみを使用できます。
たとえば、 product_attributesのワイルドカード インデックスを持つinventoryコレクションを考えてみましょう。 ワイルドカード インデックスは、次のクエリのすべての述語をサポートすることはできません。
db.inventory.find( { "product_attributes.price": { $gt: 20 }, "product_attributes.material": "silk", "product_attributes.size": "large" } )
代わりに、 MongoDB はワイルドカードを使用してクエリ述語の 1 つだけをサポートします。MongoDB は、関連するワイルドカードパスに基づいて、サポートする述語を自動的に選択します。サポートされていないクエリ述語は、rejectedPlans の explain 結果 に表示されます。
これは、複合ワイルドカード インデックスにも当てはまります。複合インデックスのワイルドカード期間はクエリ述語の 1 つだけをサポートできますが、非ワイルドカード期間は残りの述語をサポートできます。
ソートを含むクエリ
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()の両方を満たすことができます。