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

ワイルドカード インデックスの制限

項目一覧

  • 複合ワイルドカード インデックスの制限
  • 互換性のないインデックス プロパティ
  • 互換性のないインデックス タイプ
  • シャードキー
  • サポートされていないクエリパターン
  • 配列フィールドは と等しくない null
  • ドキュメントと配列の等価一致
  • フィールドが存在しない
  • マルチフィールドクエリ述語
  • ソートを含むクエリ

このページでは、互換性のないプロパティやサポートされていないクエリ パターンなど、ワイルドカード インデックスの制限について説明します。

複合ワイルドカード インデックスには次の制限があります。

  • 複合ワイルドカード インデックスには、ワイルドカードタームを 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と等しくないドキュメントのクエリをサポートできません。

たとえば、 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 結果 の に表示されます。

注意

$or の動作

MongoDB では、クエリ$orまたは集計$or演算子の各独立した引数をサポートするために同じワイルドカード インデックスを使用する場合があります。

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()の両方を満たすことができます。

戻る

署名