Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

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

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

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

  • 複合ワイルドカード インデックスには、ワイルドカードタームを 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
    }
    }
    )

MongoDB8.3 (および8.2.4 、 、.8.0.18 7.029以降では、無効な構成を防止するために、より厳格な検証ルールが複合ワイルドカード インデックスのwildcardProjection に適用されます。

新しい検証要件を満たさない既存のインデックスは引き続き機能しますが、これらの要件を満たさない新しいインデックスを作成することはできません。

複合ワイルドカード インデックスで wildcardProjection を使用する場合、次のルールが適用されます。

ルール
有効な例
無効な例

wildcardProjection を指定する場合、空にすることはできません。

{ productId: 1, "$**": 1 },
{
wildcardProjection: {
attributes: 1
}
}
{ productId: 1, "$**": 1 },
{
wildcardProjection: { }
}

包含または除外フィールドが _id の場合にのみ、wildcardProjection で包含と除外を組み合わせることができます。包含プロジェクションでは _id を除外することも、 _id 除外プロジェクションを含めることもできます。

{ "$**": 1, category: 1 },
{
wildcardProjection: {
_id: 0,
attributes: 1
}
}
{ "$**": 1, category: 1 },
{
wildcardProjection: {
_id: 1,
metadata: 0
}
}
{ "$**": 1, category: 1 },
{
wildcardProjection: {
_id: 0,
price: 0,
stock: 1
}
}

wildcardProjection に含まれるフィールドは、通常の(ワイルドカード以外の)インデックスフィールドと重複してはなりません。

{ userId: 1, "$**": 1 },
{
wildcardProjection: {
preferences: 1
}
}
{ userId: 1, "$**": 1 },
{
wildcardProjection: {
userId: 1
}
}

通常のインデックスフィールドも _id である場合にのみ、_id のみの除外を指定できます。

{ _id: 1, "$**": 1 },
{
wildcardProjection: {
_id: 0
}
}
{ productId: 1, "$**": 1 },
{
wildcardProjection: {
_id: 0
}
}

wildcardProjection が除外する場合、すべての通常のインデックスフィールドを除外する必要があります。

{
userId: 1,
category: 1,
"$**": 1
},
{
wildcardProjection: {
userId: 0,
category: 0
}
}
{
userId: 1,
category: 1,
"$**": 1
},
{
wildcardProjection: {
userId: 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 は、クエリ フィールドの 1 つをサポートするためにワイルドカードのみを使用できます。

たとえば、 product_attributesのワイルドカード インデックスを持つinventoryコレクションを考えてみましょう。 ワイルドカード インデックスは、次のクエリのすべての述語をサポートすることはできません。

db.inventory.find(
{
"product_attributes.price": { $gt: 20 },
"product_attributes.material": "silk",
"product_attributes.size": "large"
}
)

代わりに、 MongoDB はワイルドカードを使用してクエリ述語の 1 つだけをサポートします。MongoDB は、関連するワイルドカードパスに基づいて、サポートする述語を自動的に選択します。サポートされていないクエリ述語は、rejectedPlansexplain 結果 に表示されます。

これは、複合ワイルドカード インデックスにも当てはまります。複合インデックスのワイルドカード期間はクエリ述語の 1 つだけをサポートできますが、非ワイルドカード期間は残りの述語をサポートできます。

注意

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

戻る

署名