AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

facet (MongoDB Search 演算子)

facet

facet コレクターは、指定されたファセット フィールドの値または範囲で結果をグループ化し、各グループのカウントを返します。

$search ステージと $searchMeta ステージの両方で facet を使用できます。MongoDB では、クエリのみのメタデータ結果を取得するために、facet ステージで $searchMeta を使用することを推奨しています。$search ステージを使用してメタデータ結果とクエリ結果を取得するには、$$SEARCH_META 集計変数を使用する必要があります。詳しくは、「SEARCH_META 集計変数」を参照してください。

embeddedDocuments フィールド型定義で storedSource を定義すると、 returnStoredSource とともに returnScope を使用して、オブジェクト配列内のネストされたフィールドにファセットを設定できます。それ以外の場合は、ルートの embeddedDocuments 型フィールドに対してのみファセットを設定できます。ファセットの例:

facet の構文は次のとおりです。

{ "$searchMeta"|"$search": { "index": <index name>, // optional, defaults to "default" "facet": { "operator": { <operator-specifications> }, "facets": { <facet-definitions> } }, "returnScope": { "path": "<embedded-documents-field-to-query>" }, "returnStoredSource": true }}
フィールド
タイプ
必須
説明

facets

ドキュメント

はい

各ファセットのデータをバケット化するための情報。少なくとも 1 つのファセット定義を指定する必要があります。各ファセット定義では、各バケットのメトリクスを計算するためのファセット集計も指定できます。

operator

ドキュメント

no

ファセットを実行するために使用する演算子 。省略した場合、 MongoDB Search はコレクション内のすべてのドキュメントに対してファセットを実行します。

ファセットクエリは、クラスター階層に関係なく、メモリを大量に消費します。ファセット集計またはネストされたファセットを指定するクエリは、他のファセットクエリよりも多くのメモリとディスクを必要とします。本番環境でファセットを使用する前に、クラスターにワークロードを処理するのに十分なメモリがあることを確認してください。詳細については、「Search Memory マネジメント」を参照してください。ワークロードのサイジングに関するガイダンスについては、サポートにリクエストしてください。

ファセットクエリが必要とするメモリは、numBuckets または boundaries を使用してリクエストするバケットの数ではなく、ファセットするフィールドの一意の値の数によって異なります。例、500 万個の一意の値を持つフィールドで 20 個のバケットをリクエストするファセットでは、上位 20 個のバケットを決定するためにすべての一意の値をカウントします。

ネストされたファセットの場合、クエリで計算される一意の値の合計は、ネストの各レベルにわたる一意の値に基づいて乗算されます。個々のフィールドの濃度が低い場合でも、ネストされたパス全体で値を組み合わせると、多数の一意のバケットが生成される可能性があります。ネストされたファセットがバケットを乗算する方法の詳細については、「ネストされたファセット」を参照してください。

MongoDB Searchはクエリごとにバケット数を個別に追跡するため、合計メモリ使用量は同時実行されるファセットクエリの数に応じて増加します。シャーディングされたクラスターでは、MongoDB Searchは各シャードからのバケットをマージするためにもメモリを必要とします。このメモリ使用量は、シャードの数とバケットの数に応じて増加します。

ファセット定義ドキュメントには、ファセット名とファセットのタイプに固有のオプションが含まれています。MongoDB Search は次の型のファセットをサポートしています。

重要

stringFacet は廃止予定です。代わりにトークンを使用することで、ファセットが改善されます。

ファセットの更新されたフィールド型と古いフィールド型の違いの詳細については、ファセットのフィールド型の比較を参照してください。

文字列ファセットを使用すると、指定された文字列フィールド内の最も頻繁に出現する文字列値に基づいて、MongoDB Search 結果を絞り込むことができます。文字列フィールドは、トークンとしてインデックス付けする必要があることに注意してください。埋め込みドキュメント内のstringフィールドをファセットするには、親フィールドもドキュメント型としてインデックス付けする必要があります。配列内の文字列または埋め込みドキュメントをファセットすると、MongoDB Search は一致するルート ドキュメントの数に基づいてファセット数を返します。

文字列ファセットの構文は次のとおりです。

{ "$searchMeta": { "facet":{ "operator": { <operator-specification> }, "facets": { "<facet-name>" : { "type" : "string", "path" : "<field-path>", "numBuckets" : <number-of-categories>, "embeddedDocument": { <embedded-document-scope> } // optional } } } }}
オプション
タイプ
説明
必須

embeddedDocument

オブジェクト

クエリ述語に一致する embeddedDocuments 配列の子ドキュメントのみにファセットのバケットカウントをスコープします。詳細については、埋め込みドキュメント配列の一致する子に対するファセットを参照してください。

no

numBuckets

整数

結果で返されるファセット カテゴリの最大数。値は 10000 以下である必要があります。指定した場合、データがリクエストされた数よりも少ないカテゴリにグループ化されると、MongoDB Search はリクエストされた数よりも少ないカテゴリを返すことがあります。省略した場合、デフォルトは 10 になります。つまり、MongoDB Search はカウントで上位 10 個のファセット カテゴリのみを返します。

no

path

string

ファセットするフィールドパス。トークンとしてインデックス付けされたフィールドを指定できます。

はい

type

string

ファセットの型。値はstringでなければなりません。

はい

例

次の例では、sample_mflix.movies コレクションで default という名前のインデックスを使用します。コレクション内の genres フィールドはトークン型としてインデックス付けされ、year フィールドは数値型としてインデックス付けされます。

{ "mappings": { "dynamic": false, "fields": { "genres": { "type": "token" }, "year": { "type": "number" } } }}

クエリは、$searchMeta ステージを使用して、movies コレクションの year フィールドで 2000 年から 2015 年までの映画を検索し、各ジャンルの映画の数を検索します。

db.movies.aggregate([ { "$searchMeta": { "facet": { "operator": { "range": { "path": "year", "gte": 2000, "lte": 2015 } }, "facets": { "genresFacet": { "type": "string", "path": "genres" } } } } }])

これらの結果の詳細については、「ファセット結果」を参照してください。

重要

numberFacet は廃止予定です。代わりに数値を使用してください。これにより、ファセットが改善されます。

ファセットの更新されたフィールド型と古いフィールド型の違いの詳細については、ファセットのフィールド型の比較を参照してください。

数値ファセットを使用すると、結果を個別の数値の範囲に分割して、検索結果内の数値の頻度を判断できます。配列または埋め込みドキュメント内の数値をファセットと、 MongoDB Search は一致するルート ドキュメントの数に基づいてファセット数を返します。

数値ファセットの構文は次のとおりです。

{ "$searchMeta": { "facet":{ "operator": { <operator-specification> }, "facets": { "<facet-name>" : { "type" : "number", "path" : "<field-path>", "boundaries" : <array-of-numbers>, "default": "<bucket-name>", "embeddedDocument": { <embedded-document-scope> } // optional } } } }}
オプション
タイプ
説明
必須

boundaries

数字の配列

バケットの境界を指定する昇順の数値リスト。2 から 1 万 ([2, 10000]) の境界値を指定する必要があります。隣接する値のペアは、包括的な下限と排他的な上限を持つバケットを定義します。次の BSON types の値の任意の組み合わせを指定できます。

  • 32 ビット整数(int32)

  • 64 ビット整数(int64)

  • 64 ビットバイナリ浮動小数点(double)

はい

default

string

指定された境界内に含まれない、演算子から返されたドキュメントをカウントする追加のバケットの名前。省略した場合、 MongoDB Search には、指定されたバケットに該当しないファセット演算子の結果も含まれますが、バケット数には含まれません。

no

embeddedDocument

オブジェクト

クエリ述語に一致する embeddedDocuments 配列の子ドキュメントのみにファセットのバケットカウントをスコープします。詳細については、埋め込みドキュメント配列の一致する子に対するファセットを参照してください。

no

path

string

ファセットするフィールドパス。数値型としてインデックス付けされたフィールドを指定できます。

はい

type

string

ファセットの型。値はnumberでなければなりません。

はい

例

次の例では、sample_mflix.movies コレクションで default という名前のインデックスを使用します。コレクション内の year フィールドは、数値型としてインデックスされます。

{ "mappings": { "dynamic": false, "fields": { "year": [ { "type": "number" } ] } }}

クエリは、$searchMeta ステージを使用して、movies コレクションの year フィールドで 1980 年から 2000 年までの映画を検索し、クエリのメタデータ結果を検索します。クエリでは 3 つのバケットを指定します。

  • 1980(このバケットの下限値を含む)

  • 1990(1980 バケットの上限(排他的)とこのバケットの下限(包括的))

  • 2000(1990 バケットの排他的上限)

クエリでは、指定された境界のいずれにも該当しないクエリの結果を検索するために、other という名前の default バケットも指定します。

db.movies.aggregate([ { "$searchMeta": { "facet": { "operator": { "range": { "path": "year", "gte": 1980, "lte": 2000 } }, "facets": { "yearFacet": { "type": "number", "path": "year", "boundaries": [1980,1990,2000], "default": "other" } } } } }])

これらの結果の詳細については、「ファセット結果」を参照してください。

重要

dateFacet は廃止予定です。代わりに date を使用することで、ファセットが改善されます。

ファセットの更新されたフィールド型と古いフィールド型の違いの詳細については、ファセットのフィールド型の比較を参照してください。

日付ファセットを使用すると、日付に基づいて検索結果を絞り込むことができます。配列または埋め込みドキュメント内の日付をファセットと、 MongoDB Search は一致するルート ドキュメントの数に基づいてファセット数を返します。

日付ファセットの構文は次のとおりです。

{ "$searchMeta": { "facet":{ "operator": { <operator-specification> }, "facets": { "<facet-name>" : { "type" : "date", "path" : "<field-path>", "boundaries" : <array-of-dates>, "default": "<bucket-name>", "embeddedDocument": { <embedded-document-scope> } // optional } } } }}
オプション
タイプ
説明
必須

boundaries

数字の配列

各バケットの境界を指定する日付値のリスト。以下を指定する必要があります:

  • 少なくとも 2 つの境界を設定し、それらは 10,000([2, 10000])以下とします。

  • 値は昇順で表示され、日付が最も古いものから順に表示されています

隣接する各値のペアは、バケットの包括的な下限と排他的な上限として機能します。

はい

default

string

指定された境界内に含まれない、演算子から返されたドキュメントをカウントする追加のバケットの名前。省略した場合、 MongoDB Search には指定されたバケットに該当しないファセット演算子の結果も含まれますが、 MongoDB Search はこれらの結果をバケットカウントに含めません。

no

embeddedDocument

オブジェクト

クエリ述語に一致する embeddedDocuments 配列の子ドキュメントのみにファセットのバケットカウントをスコープします。詳細については、埋め込みドキュメント配列の一致する子に対するファセットを参照してください。

no

path

string

ファセットするフィールドパス。日付型としてインデックス付けされたフィールドを指定できます。

はい

type

string

ファセットの型。値はdateでなければなりません。

はい

例

次の例では、sample_mflix.movies コレクションで default という名前のインデックスを使用します。コレクション内の released フィールドは、date 型としてインデックス付けされます。

{ "mappings": { "dynamic": false, "fields": { "released": [ { "type": "date" } ] } }}

クエリは、$searchMeta ステージを使用して、movies コレクションの released フィールドで 2000 年から 2015 年までの映画を検索し、クエリのメタデータ結果を検索します。このクエリでは、次の 4 つのバケットを指定します。

  • 2000-01-01(このバケットの下限値を含む)

  • 2005-01-01(2000-01-01 バケットの上限(排他的)とこのバケットの下限(包括的))

  • 2010-01-01(2005-01-01 バケットの上限(排他的)とこのバケットの下限(包括的))

  • 2015-01-01(2010-01-01 バケットの排他的上限)

クエリでは、指定された境界のいずれにも該当しないクエリの結果を検索するために、other という名前の default バケットも指定します。

db.movies.aggregate([ { "$searchMeta": { "facet": { "operator": { "range": { "path": "released", "gte": ISODate("2000-01-01T00:00:00.000Z"), "lte": ISODate("2015-01-31T00:00:00.000Z") } }, "facets": { "yearFacet": { "type": "date", "path": "released", "boundaries": [ISODate("2000-01-01"), ISODate("2005-01-01"), ISODate("2010-01-01"), ISODate("2015-01-01")], "default": "other" } } } } }])

これらの結果の詳細については、「ファセット結果」を参照してください。

更新されたMongoDB検索フィールドタイプは、古いタイプ(stringFacet、numberFacet、dateFacet)と比較して、ファセットをサポートする機能が改善されています。次の表では、機能における主な違いをまとめています。

ファセットカテゴリ
更新されたフィールドタイプ
古いファセットの型
重要な違い

文字列

stringFacet(廃止予定)

ノーマライザーのサポート: token 型は、ファセットバケットを変換するノーマライザーをサポートしています。例、normalizer: lowercase を使用すると、「ADIDAS」と「adidas」は同じバケットとしてカウントされますが、stringFacet ではそれらが別のバケットとして扱われます。

Numeric

numberFacet(廃止予定)

配列のサポート: number 型は、ファセットバケットの配列内の値を考慮します。例として、配列値 [0, 10] を持つドキュメントはバケット [1, 5] と [6, 10] の両方にカウントされますが、numberFacet は配列値を完全に無視します。

日付

dateFacet(廃止予定)

配列サポート: date タイプは、ファセットバケットの配列内の値を考慮します。例、日付を含む配列値は複数の日付範囲バケットに貢献できますが、dateFacet は配列値を完全に無視します。

注意

古いフィールド型と更新されたフィールド型の両方が同じフィールドで定義されている場合は、古いファセット型が優先されます。例、フィールドに token と stringFacet の両方が定義されている場合、ファセット計算では stringFacet マッピングが使用されます。

各ファセット定義には、任意の embeddedDocument フィールドを含めることができます。このフィールドは、ファセットのバケットカウントを、クエリ述語に一致する embeddedDocuments 配列内の子ドキュメントのみにスコープします。embeddedDocument フィールドを省略した場合、ファセットはドキュメントインデックスになります。

embeddedDocumentがない場合、ルートドキュメントは、facet.operatorブロックで定義されたクエリに一致しない子ドキュメントであっても、そのバケットに該当する子ドキュメントがあれば、そのバケットでカウントされます。embeddedDocumentフィールドは、バケットへの寄与を、指定されたembeddedDocument.operatorに一致する子のみに制限します。各ルートドキュメントは、バケットごとに最大1回カウントされます。

embeddedDocument フィールドは、次のフィールドがあります。

フィールド
タイプ
説明
必須

path

string

ファセットのスコープを絞り込むためのインデックス付き embeddedDocuments 型フィールド。ファセットの path は、このフィールドの子孫である必要があります。

はい

operator

オブジェクト

path で指定する embeddedDocuments 配列内の各子ドキュメントに対して実行する 演算子。この演算子に一致する子ドキュメントのみが、ファセットのバケットカウントに寄与します。この演算子で参照されるすべてのパスは、path の子孫である必要があります。

はい

数値または日付ファセットの場合、値が構成済みのboundariesの範囲外にある一致する子ドキュメントは、ドキュメントインデックス付きファセットと同じルールを使用して、指定されている場合はdefaultバケットにカウントされます。一致する子ドキュメントがないルートドキュメントはembeddedDocumentスコープのファセットには寄与しませんが、同じクエリ内の他のスコープなしファセットには寄与する可能性があります。

重要

embeddedDocumentスコープのファセットを他のいくつかのファセットオプションと組み合わせることはできません。詳しくは、「制限」を参照してください。

例については、埋め込みスコープのファセットの例を参照してください。

重要

ファセット集計はプレビュー中です。機能および関連するドキュメントは、プレビュー期間中にいつでも変更される可能性があります。詳細を学ぶには、プレビュー機能を参照してください。

各ファセットバケットのメトリクスを計算するには、aggregationsドキュメントをファセット定義に追加します。MongoDB SearchはMongoDB Searchインデックスからメトリクスを計算するため、パイプラインの後半で$groupステージを実行するよりもはるかに効率的です。

各ファセット バケットでは、aggregations を使用して次の値を計算できます。

  • 合計

  • 平均

  • minimum

  • maximum

  • 最初に

  • last

aggregationsを使用する場合は、次のことを行う必要があります。

  • 各メトリクスのpathで指定するフィールドをtoken、number、またはdateとしてインデックス化します。

  • バケット数が必要な場合は、count メトリクスを明示的に含めてください。

  • aggregationsは、ネストされたファセットのリーフレベルでのみ指定してください。

    中間的なグループ化のメトリクスを計算する場合は、そのグループ化を aggregations を使用した個別のトップレベルのファセットとして指定し、ネストされたファセットは指定しないでください。

MongoDB Search は、MongoDB Search インデックス内のデータに対して aggregations を計算します。このインデックスは 終極的にコンシステントです。

注意

メモリ要件

aggregations または ネストされたファセット を指定するファセットクエリは、他のファセットクエリの要件を超えて、MongoDB Search インデックスに必要なメモリとディスクを増加させます。詳しく学ぶには、「メモリ要件」をご覧ください。

aggregations の構文は次のとおりです。

{ "$searchMeta": { "facet": { "facets": { "<facet-name>": { "type": "<facet-type>", "path": "<field-path>", "aggregations": { "<aggregation-name>": { "type": "sum" | "min" | "max" | "avg" | "first" | "last", "path": "<field-path>" } } } } } }}

aggregations ドキュメントの各キーは、指定した集計名です。MongoDB Search は、指定した名前の下にあるバケットドキュメント内の各集計を返します。

オプション
タイプ
説明
必須

path

string

メトリクスを計算するフィールドパス。これは、pathを受け入れないcountを除くすべてのメトリクスタイプで必須です。他のすべてのメトリクスタイプは2番目のフィールドから値を計算するため、そのフィールドに名前を付ける必要があります。例として、バケット内のドキュメントの平均評価を返すには、avgをratingのpathで指定します。countメトリクスはバケット内のドキュメントをカウントするため、2番目のフィールドは必要ありません。

条件付き

type

string

計算するメトリクスのタイプ。値は次のいずれかになります。

  • count

  • sum

  • avg

  • min

  • max

  • first

  • last

各メトリクスの詳細について学ぶには、「メトリクスの種類」を参照してください。

はい

タイプ
フィールドの要件
説明

count

なし

バケット内のドキュメントをカウントします。このメトリクスタイプには path を指定しないでください。ファセット定義から aggregations を省略した場合、MongoDB Search はバケットに対して count メトリクスを返します。aggregations を指定した場合、MongoDB Search は aggregations ドキュメントで count を指定した場合にのみ count メトリクスを返します。

sum

バケット内のドキュメントについて、指定されたフィールドの値を加算します。

avg

バケット内のドキュメントの指定したフィールドの値の平均を返します。bucket 内のドキュメントのいずれにもフィールドの値が設定されていない場合、MongoDB Search は null を返します。

min

なし

バケット内のドキュメントについて、指定されたフィールドの最小値を返します。

max

なし

バケット内のドキュメントについて、指定されたフィールドの最大値を返します。

first

なし

クエリのソートオプションで定義された順序に従って、バケット内の最初のドキュメントの指定されたフィールドの値を返します。クエリでソートが指定されていない場合、順序は任意です。ソートを指定する方法を学ぶには、MongoDB Search結果のソートを参照してください。

last

なし

クエリのソートオプションで定義された順序に従って、バケット内の最後のドキュメントの指定されたフィールドの値を返します。クエリでソートが指定されていない場合、順序は任意です。ソートを指定する方法を学ぶには、MongoDB Search結果のソートを参照してください。

重要

min また、maxはtokenを含むすべてのフィールドタイプをサポートしています。MongoDB Searchがこれらのメトリクスを計算する際、フィールドがサポートされていない型に解決されるドキュメントはスキップされます。MongoDB Searchは、ドキュメントをスキップしてもエラーを返しません。MongoDB Searchがバケット内のドキュメントをスキップしたかどうかを確認するには、同じaggregationsドキュメントにcountメトリクスを追加し、期待されるドキュメント数と比較します。

MongoDB Search がスキップしない値については、min はバケット内の最小値を選択し、max は最大値を選択します。値がすべて同じ型ではない場合、MongoDB Search は BSON 型の比較順序 を適用して、どの値が最小か最大かを判断します。

各メトリクスタイプは、配列のように複数の値に解決されるフィールドをそれぞれ異なる方法で取り扱います。

  • sum および avg ドキュメントをスキップします。

  • min そして max 配列内の最小値と最大値を選択し、ドキュメントの代表要素として使用します。

  • first および last は、すべての値を配列として返します。

first および last の場合、返される配列は、次の点でソースドキュメントと異なります。

  • 値の順序は異なる場合があります。MongoDB Searchはインデックスから値を読み取りますが、これはソースドキュメントの順序を保持しません。例として、ドキュメントに["red", "blue", "green"]が含まれている場合、MongoDB Searchは["blue", "green", "red"]を返す可能性があります。

  • MongoDB Searchは、重複する値のインスタンスを1つだけ返します。

  • MongoDB Searchは、ファセットに使用できない型の値を含め、パスにあるすべての値を返します。例として、配列に文字列とブール値の両方が含まれている場合、MongoDB Searchは文字列とともにブール値を返します。

ソースドキュメントに含まれているとおりに値を返すには、インデックス定義でフィールドの storedSource を定義し、クエリで returnStoredSource を true に設定します。

重要

ネストされたファセットはプレビュー版です。機能および関連するドキュメントは、プレビュー期間中にいつでも変更される可能性があります。詳細については、プレビュー機能をご覧ください。

各バケット内のドキュメントを追加のフィールドでグループ化するには、既存のファセット定義に facets ドキュメントを追加します。ネストされた各ファセット定義は、トップレベルのファセット定義と同じ構文を使用するため、ファセットをネストしてグループ化のツリーをビルドできます。MongoDB Searchは、ネストされたファセットのバケットを、その親ファセットの各バケット内に返します。

ネストされたファセットを含むファセットの各バケットについて、MongoDB Searchはバケット内のドキュメント数を示すcountフィールドも返します。これらの中間バケットに対してcountメトリクスを指定する必要はありません。

ファセットは、レベル数に制限なくネストできます。ただし、以下の制限が適用されます。

  • aggregations は、ネストされたファセットツリーのリーフファセットでのみ指定できます。facets を指定するファセット定義では、aggregations を指定することもできません。中間グループ化のメトリクスを計算するには、そのグループ化を aggregations を持つ個別のトップレベルファセットとして指定し、ネストされたファセットは指定しません。

  • ネストされたファセットに count という名前を付けることはできません。MongoDB Search は、中間バケットのドキュメント数として count を予約しています。

  • クエリが返すことができる一意のバケットの総数は、100000を超えることはできません。1つのファセットツリーが生成するバケットを計算するには、そのネストされたブランチの各レベルにあるバケットの数を掛け合わせます。レベルごとのバケット数は、string ファセットの場合は numBuckets、数値または日付ファセットの場合は boundaries と default で定義されるバケット数になります。例として、20個のバケットをリクエストし、20個のバケットをリクエストするネストされたファセットを含むファセットは、400個の一意のバケットを生成します。各レベルでこの合計が乗算されるため、各レベルでより多くのバケットをリクエストすると、ネストできるレベルの数が減ります。

ファセットクエリの場合、 MongoDB Search は、定義されたファセット名と、そのファセットのバケットの配列とのマッピングを結果に返します。ファセット結果ドキュメントには、ファセットの結果バケットの配列である buckets オプションが含まれています。配列内の各ファセットバケットドキュメントには、次のフィールドがあります。

オプション
タイプ
説明

_id

オブジェクト

このファセット バケットを識別するユニークな識別子。この値は、ファセットされるデータ型と一致します。

count

整数

このファセットバケット内のドキュメントの数。countフィールドの詳細については、 MongoDB検索結果のカウント を参照してください。

ファセット定義で ファセット集計 が指定されている場合、各バケットドキュメントには、count フィールドではなく、aggregations ドキュメントで指定したメトリクスが含まれます。ファセット定義で ネストされたファセット が指定されている場合、各バケットドキュメントには、バケット内のドキュメント数を示す count フィールドと、ネストされたファセットの結果が含まれます。

MongoDB Search を使用すると、同じファセット内の複数のバケットを同時に表示および選択できます。通常、ファセット内でバケットを選択すると、その選択に従って検索結果がフィルタリングされ、すべてのファセットのカウントが変更されます。

例

sample_airbnb.listingsコレクションのインデックス定義で、次のフィールドのファセットが指定されているとします。

  • cancellation_policy

  • room_type

  • accommodates

cancellation_policyファセットには次のバケットがあります。

  • flexible

  • moderate

  • strict_14_with_grace_period

  • super_strict_30

  • super_strict_60

各バケットには、独自の結果カウントがあります。moderate cancellation_policy を検索すると、他の 4 つのバケットのカウントは 0 になります。さらに、room_type ファセットと accommodates ファセットのバケットのカウントは、同様に flexiblecancellation_policy を持つ各バケットの結果の数に減ります。

ファセットが検索結果のカウントに与える影響をより細かく制御する必要があるシナリオでは、ファセット クエリで doesNotAffectプロパティを使用して複数選択のファセットを有効にします。これらのファセットは引き続き結果をフィルタリングしますが、クエリは結果数を変更しません。

以下の演算子で doesNotAffect を指定できます。

複数のファセットを除外するには、ファセット名の配列を指定します。ほとんどのユースケースでは、フィルターとパスを共有するファセットのみを除外します。例として、rating フィールドに対する equals フィルターは、rating をパスとして使用するファセットの名前を指定します。

注意

doesNotAffect オプションは、集計を指定するファセットとは使用できません。詳しくは、「制限」を参照してください。

例

moderate cancellation_policy があるドキュメントのsample_airbnb.listingsAndReviews コレクションに対するクエリを検討します。doesNotAffect の値を cancellation_policy に指定すると、cancellation_policy ファセットのバケットのカウントは変更されませんが、他のファセットのバケットの結果カウントは、同様に moderatecancellation_policy を持つ各バケットの結果の数に減ります。

詳細については、複数選択ファセットの例を参照してください。

doesNotAffect を embeddedDocument スコープのファセットと組み合わせることはできません。詳細については、埋め込みドキュメント配列の一致する子に対するファセットを参照してください。

最後に、多くのファセットを持つユースケースでは、特定のファセットに影響する他のフィルターを制限できます。これを行うには、他のフィールドのファセットを含め、任意のフィルターの doesNotAffect プロパティで任意のファセットを指定します。これにより、どの選択がより迅速に、またはより緩やかに選択肢を絞り込むかを一目で確認できます。

例

accommodates 値が 3 であるドキュメントの sample_airbnb.listingsAndReviews コレクションに対するクエリを検討します。doesNotAffect の値として cancellation_policy を指定した場合、room_type バケットの結果数は、3 人も収容できる各バケット内の結果数に減少しますが、cancellation_policy のバケットの結果数は影響を受けません。

詳細については、「ファセット間フィルター除外の例」を参照してください。

$search ステージを使用してクエリを実行すると、MongoDB Search はメタデータの結果を $$SEARCH_META 変数に保存し、検索結果のみを返します。サポートされているすべての集計パイプライン ステージで $$SEARCH_META 変数を使用して、$search クエリのメタデータ結果を表示できます。$$SEARCH_META 変数は、ファセット.集計 と一緒に使用することもできます。

MongoDB では、検索結果とメタデータ結果の両方が必要な場合にのみ $$SEARCH_META 変数を使用することを推奨します。それ以外の場合は、次を使用します。

  • $search ステージを使用して、検索結果のみを取得します。

  • $searchMeta ステージを使用して、メタデータ結果のみを取得します。

ファセット クエリは単一のフィールドに対してのみ実行できます。フィールドのグループに対してファセット クエリを実行することはできません。

次の制限が 埋め込みドキュメント配列の一致する子に対するファセット: に適用されます。

  • 同じクエリ内で、トップレベルの returnScope オプションと embeddedDocument スコープのファセットを結合することはできません。

  • embeddedDocumentスコープのファセットはカウントのみを返します。

  • ドリルサイドウェイズファセット(doesNotAffect)とembeddedDocumentスコープのファセットを同じクエリで組み合わせることはできません。

ファセット集計には、次の制限が適用されます。

  • aggregations では、次のオプションは使用できません。

  • 次の BSON types: に対してファセットを実行したり、集計を計算したりすることはできません。

    • binData

    • bool

    • decimal

    • null

    • objectId

    • timestamp

    これらの型のいずれかでメトリクスを計算するには、ビューを使用して、インデックスを作成する前にフィールドをサポートされている型に変換します。

以下の例は サンプルデータ を用いています。メタデータ結果の例では、facet を使用して $searchMeta クエリを実行し、結果内のメタデータのみを検索する方法を示します。メタデータと検索結果の例では、facet と $SEARCH_META 集計変数を使用して $search クエリを実行し、検索結果とメタデータ結果の両方を検索する方法を示します。returnScope の例は、embeddedDocuments 型を使用して動的にインデックス化されたオブジェクト配列内のネストされたフィールドでファセットを作成する方法を示しています。埋め込みスコープのファセットの例では、embeddedDocuments 配列の一致する子のみでファセットを作成する方法を示します。複数選択およびファセット間のフィルター除外の例では、doesNotAffect を使用してファセットが互いのカウントに与える影響を制御する方法を示します。集計の例では各ファセットバケットのメトリクスを計算する方法を示し、ネストされたファセットの例では結果を2番目のフィールドでグループ化し、各バケットのメトリクスを計算する方法を示します。

詳しくは、 MongoDB Searchでファセットの使用方法 を参照してください。

MongoDB Search の facet( MongoDB Search 演算子) について詳しくは、コース と ビデオ でご覧ください。

MongoDB Search でファセットの使用の詳細については、MongoDB Universityの Intro MongoDBコース の ユニット 9 を受講してください。1.5 時間のユニットには、 MongoDB Search の概要、 MongoDB Search インデックスの作成、複合演算子を使用した $search クエリの実行中、facet を使用した結果のグループ化に関するレッスンが含まれています。

このビデオでは、クエリ内で数値と string facet (MongoDB Search 演算子)を作成して使用し、結果をグループ化してグループ内の結果の数を取得する方法について説明します。

所要時間: 11 分

このページを評価