ワイルドカード インデックスにフィールドを含める、または除外する
ワイルドカード インデックスを作成するときに、インデックスに含めるフィールドまたは除外するフィールドを指定できます。 これにより、次のことが可能になります。
特定のフィールドのみをカバーするワイルドカード インデックスを作成します。 たとえば、複数のサブフィールドを持つ埋め込みドキュメントが複数ある場合は、埋め込みドキュメントとそのサブフィールドの両方に対するクエリをカバーするインデックスを作成できます。
特定のフィールドを省略するワイルドカード インデックスを作成します。 たとえば、クエリされないフィールドを含むコレクションがある場合は、そのフィールドをインデックスから省略できます。
ワイルドカード インデックスにフィールドを含める、または除外するには、選択したフィールドを wildcardProjection
オプションで指定します。
db.<collection>.createIndex( { "$**" : <sortOrder> }, { "wildcardProjection" : { "<field1>" : < 0 | 1 >, "<field2>" : < 0 | 1 >, ... "<fieldN>" : < 0 | 1 > } } )
wildcardProjection
ドキュメントで、値0
または1
は、フィールドがインデックスに含まれているか除外されているかを示します。
0
フィールドが除外されることを意味します。1
には、 フィールドが含まれることを意味します。
制限事項
wildcardProjection
オプションを使用するには、インデックス キーが$**
である必要があります。ワイルドカード インデックスは、
_id
フィールドを明示的に含める場合を 除き 、wildcardProjection
ドキュメントに包含・除外ステートメントを混在させることはできません。 例:次の
wildcardProjection
ドキュメントは、含めるフィールドと除外するフィールドの両方を指定しているため無効です。{ "wildcardProjection" : { "attributes" : 0, "users" : 1 } } 次の
wildcardProjection
ドキュメントは有効であり、包含と除外の両方を指定しているにもかかわらず、_id
フィールドが含まれているためです。{ "wildcardProjection" : { "attributes" : 0, "_id" : 1 } }
始める前に
次のドキュメントを含むproducts
コレクションを作成します。
db.products.insertMany( [ { "item": "t-shirt", "price": "29.99", "attributes": { "material": "cotton", "color": "blue", "size": { "units": "cm", "length": 74 } } }, { "item": "milk", "price": "3.99", "attributes": { "sellBy": "02-06-2023", "type": "oat" } }, { "item": "laptop", "price": "339.99", "attributes": { "memory": "8GB", "size": { "units": "inches", "height": 10, "width": 15 } } } ] )
各ドキュメントには、製品の詳細を含むattributes
フィールドがあります。 attributes
のサブフィールドは製品によって異なります。
手順
wildcardProjection
オプションを使用すると、次のことができます。
ワイルドカード インデックスに特定のフィールドを含める
特定のドキュメント フィールドを頻繁にクエリする場合は、それらのフィールドをwildcardProjection
で指定して、インデックスに不要な肥大化を与えずにクエリをサポートできます。
次の操作を実行すると、 フィールドと フィールドのすべてのスカラー値(文字列と数値)を含むワイルドカードattributes.size
attributes.color
インデックスが作成されます。
db.products.createIndex( { "$**" : 1 }, { "wildcardProjection" : { "attributes.size" : 1, "attributes.color" : 1 } } )
結果
キー パターン"$**"
はドキュメント内のすべてのフィールドをカバーしますが、 wildcardProjection
フィールドは 含まれるフィールドのみにインデックスを制限します。
フィールドが埋め込みドキュメントまたは配列( attributes.size
など)の場合、ワイルドカード インデックスはフィールドに再帰し、埋め込まれたスカラー フィールド値をすべてインデックス化します。
作成されたインデックスは、 wildcardProjection
オブジェクトに含まれる任意のスカラー値に対するクエリをサポートします。 たとえば、 インデックスは次のクエリをサポートしています。
db.products.find( { "attributes.size.height" : 10 } ) db.products.find( { "attributes.color" : "blue" } )
インデックスは、 wildcardProjection
オブジェクトに含まれるフィールドに対するクエリのみをサポートします。 この例では、MongoDB は次のクエリのコレクションスキャンを実行します。これは、 wildcardProjection
オブジェクトに存在しないフィールドが含まれているためです。
db.products.find ( { "item": "milk" } )
ワイルドカード インデックスから特定のフィールドを除外する
ほとんどクエリを実行しないドキュメントフィールドがある場合は、それらのフィールドを省略するワイルドカード インデックスを作成できます。
次の操作を実行すると、 products
コレクション内のすべてのドキュメント フィールドにワイルドカード インデックスが作成されますが、インデックスからattributes.memory
フィールドが省略されます。
db.products.createIndex( { "$**" : 1 }, { "wildcardProjection" : { "attributes.memory" : 0 } } )
結果
キー パターン"$**"
はドキュメント内のすべてのフィールドをカバーしますが、 wildcardProjection
フィールドはattributes.memory
値をインデックスから除外します。
フィールドが埋め込みドキュメントまたは配列( attributes.size
など)の場合、ワイルドカード インデックスはフィールドに再帰し、埋め込まれたスカラー フィールド値をすべてインデックス化します。
たとえば、 インデックスは次のクエリをサポートしています。
db.products.find( { "attributes.color" : "blue" } ) db.products.find( { "attributes.size.height" : 10 } )
インデックスはattributes.memory
のクエリをサポートしていません。このフィールドはインデックスから省略されていたためです。
詳細
複合ワイルドカード インデックスでワイルドカード プロジェクションを使用してフィールドをフィルタリングする方法については、「 wildcardProjection
でフィールドをフィルタリングするを参照してください
ワイルドカード インデックスの動作とユースケースの詳細については、以下を参照してください。