Docs Menu
Docs Home
/
MongoDBマニュアル
/ / /

ワイルドカード インデックスにフィールドを含める、または除外する

項目一覧

  • 制限事項
  • 始める前に
  • 手順
  • ワイルドカード インデックスに特定のフィールドを含める
  • ワイルドカード インデックスから特定のフィールドを除外する
  • 詳細

ワイルドカード インデックスを作成するときに、インデックスに含めるフィールドまたは除外するフィールドを指定できます。 これにより、次のことが可能になります。

  • 特定のフィールドのみをカバーするワイルドカード インデックスを作成します。 たとえば、複数のサブフィールドを持つ埋め込みドキュメントが複数ある場合は、埋め込みドキュメントとそのサブフィールドの両方に対するクエリをカバーするインデックスを作成できます。

  • 特定のフィールドを省略するワイルドカード インデックスを作成します。 たとえば、クエリされないフィールドを含むコレクションがある場合は、そのフィールドをインデックスから省略できます。

ワイルドカード インデックスにフィールドを含める、または除外するには、選択したフィールドを 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 でフィールドをフィルタリングするを参照してください

ワイルドカード インデックスの動作とユースケースの詳細については、以下を参照してください。

戻る

作成