定義
facetfacetコレクターは、指定されたファセット フィールドの値または範囲で結果をグループ化し、各グループのカウントを返します。は、
$search$searchMetaステージと ステージの両方で使用できます。facetMongoDB、クエリのみのメタデータ結果を検索するために、facet$searchMetaステージで を使用することを推奨しています。$searchステージを使用してメタデータ結果とクエリ結果を取得するには、$$SEARCH_META集計変数を使用する必要があります。詳しくは、SEARCH_META集計変数を参照してください。embeddedDocumentsフィールドの型定義で storedSource を定義する場合は、 returnScopes と returnStoredSource を使用して、オブジェクトの配列内のネストされたフィールドをファセットできます。それ以外の場合は、ルート 埋め込みドキュメント 型フィールドのみをファセットできます。に対するファセットの例は、次のとおりです。
オブジェクトの配列内にネストされたフィールドについては、 returnScopes の例 を参照してください。
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 } }
フィールド
フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
| ドキュメント | はい | 各ファセットのデータをバケット化するための 情報 。少なくとも 1 つの ファセット定義 を指定する必要があります。 |
| ドキュメント | no | ファセットを実行するために使用する演算子 。省略した場合、 MongoDB Search はコレクション内のすべてのドキュメントに対してファセットを実行します。 |
ファセットの定義
ファセット定義ドキュメントには、ファセット名とファセットのタイプに固有のオプションが含まれています。MongoDB Search は次の型のファセットをサポートしています。
文字列ファセット
重要
stringFacet は廃止予定です。代わりにトークンを使用することで、ファセットが改善されます。
ファセットの更新されたフィールド型の違いの詳細については、「 ファセットのフィールド型の比較 」を参照してください。
string ファセットを使用すると、指定された stringフィールド内の最も頻繁な string 値に基づいてMongoDB Search 結果を絞り込むことができます。 文字列フィールドはトークンとしてインデックス付けする必要があることに注意してください。埋め込まれたドキュメント内の文字列フィールドをファセットには、親フィールドもドキュメント型としてインデックス必要があります。配列または埋め込みドキュメント内の文字列をファセットと、 MongoDB Search は一致するルート ドキュメントの数に基づいてファセット数を返します。
構文
文字列ファセットの構文は次のとおりです。
{ "$searchMeta": { "facet":{ "operator": { <operator-specification> }, "facets": { "<facet-name>" : { "type" : "string", "path" : "<field-path>", "numBuckets" : <number-of-categories>, } } } } }
オプション
オプション | タイプ | 説明 | 必須 |
|---|---|---|---|
| 整数 | 結果で返されるファセットカテゴリの最大数。値は | no |
| string | ファセットするフィールドパス。トークンとしてインデックス付けされたフィールドを指定できます。 | はい |
| string | ファセットの型。値は | はい |
例
例
次の例では、sample_mflix.movies コレクションで default という名前のインデックスを使用します。コレクション内の genres フィールドはトークン型としてインデックス付けされ、year フィールドは数値型としてインデックス付けされます。
{ "mappings": { "dynamic": false, "fields": { "genres": { "type": "token" }, "year": { "type": "number" } } } }
クエリは、$searchMeta ステージを使用して、movies コレクションの year フィールドで 2000 年から 2015 年までの映画を検索し、各ジャンルの映画の数を検索します。
1 db.movies.aggregate([ 2 { 3 "$searchMeta": { 4 "facet": { 5 "operator": { 6 "range": { 7 "path": "year", 8 "gte": 2000, 9 "lte": 2015 10 } 11 }, 12 "facets": { 13 "genresFacet": { 14 "type": "string", 15 "path": "genres" 16 } 17 } 18 } 19 } 20 } 21 ])
1 [ 2 { 3 count: { lowerBound: Long('12568') }, 4 facet: { 5 genresFacet: { 6 buckets: [ 7 { _id: 'Drama', count: Long('7079') }, 8 { _id: 'Comedy', count: Long('3689') }, 9 { _id: 'Romance', count: Long('1764') }, 10 { _id: 'Thriller', count: Long('1584') }, 11 { _id: 'Documentary', count: Long('1472') }, 12 { _id: 'Action', count: Long('1471') }, 13 { _id: 'Crime', count: Long('1367') }, 14 { _id: 'Adventure', count: Long('1056') }, 15 { _id: 'Horror', count: Long('866') }, 16 { _id: 'Biography', count: Long('796') } 17 ] 18 } 19 } 20 } 21 ]
これらの結果の詳細については、「ファセット結果」を参照してください。
数値ファセット
重要
numberFacet は廃止予定です。代わりに数値を使用してください。これにより、ファセットが改善されます。
ファセットの更新されたフィールド型の違いの詳細については、「 ファセットのフィールド型の比較 」を参照してください。
数値ファセットを使用すると、結果を個別の数値の範囲に分割して、検索結果内の数値の頻度を判断できます。配列または埋め込みドキュメント内の数値をファセットと、 MongoDB Search は一致するルート ドキュメントの数に基づいてファセット数を返します。
構文
数値ファセットの構文は次のとおりです。
{ "$searchMeta": { "facet":{ "operator": { <operator-specification> }, "facets": { "<facet-name>" : { "type" : "number", "path" : "<field-path>", "boundaries" : <array-of-numbers>, "default": "<bucket-name>" } } } } }
オプション
オプション | タイプ | 説明 | 必須 |
|---|---|---|---|
| 数字の配列 | 各バケットの境界を指定する昇順の数値リスト少なくとも 2 つの境界を指定する必要があります。それらの境界は、1,000(
| はい |
| string | 指定された境界内に含まれない、演算子から返されたドキュメントをカウントする追加のバケットの名前。省略した場合、 MongoDB Search には、指定されたバケットに該当しないファセット演算子の結果も含まれますが、バケット数には含まれません。 | no |
| string | ファセットするフィールドパス。数値型としてインデックス付けされたフィールドを指定できます。 | はい |
| string | ファセットの型。値は | はい |
例
例
次の例では、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 バケットも指定します。
1 db.movies.aggregate([ 2 { 3 "$searchMeta": { 4 "facet": { 5 "operator": { 6 "range": { 7 "path": "year", 8 "gte": 1980, 9 "lte": 2000 10 } 11 }, 12 "facets": { 13 "yearFacet": { 14 "type": "number", 15 "path": "year", 16 "boundaries": [1980,1990,2000], 17 "default": "other" 18 } 19 } 20 } 21 } 22 } 23 ])
1 [ 2 { 3 count: { lowerBound: Long('6095') }, 4 facet: { 5 yearFacet: { 6 buckets: [ 7 { _id: 1980, count: Long('1956') }, 8 { _id: 1990, count: Long('3558') }, 9 { _id: 'other', count: Long('581') } 10 ] 11 } 12 } 13 } 14 ]
これらの結果の詳細については、「ファセット結果」を参照してください。
日付ファセット
重要
dateFacet は廃止予定です。代わりに date を使用することで、ファセットが改善されます。
ファセットの更新されたフィールド型の違いの詳細については、「 ファセットのフィールド型の比較 」を参照してください。
日付ファセットを使用すると、日付に基づいて検索結果を絞り込むことができます。配列または埋め込みドキュメント内の日付をファセットと、 MongoDB Search は一致するルート ドキュメントの数に基づいてファセット数を返します。
構文
日付ファセットの構文は次のとおりです。
{ "$searchMeta": { "facet":{ "operator": { <operator-specification> }, "facets": { "<facet-name>" : { "type" : "date", "path" : "<field-path>", "boundaries" : <array-of-dates>, "default": "<bucket-name>" } } } } }
オプション
オプション | タイプ | 説明 | 必須 |
|---|---|---|---|
| 数字の配列 | 各バケットの境界を指定する日付値のリスト。以下を指定する必要があります:
隣接する各値のペアは、バケットの包括的な下限と排他的な上限として機能します。 | はい |
| string | 指定された境界内に含まれない、演算子から返されたドキュメントをカウントする追加のバケットの名前。省略した場合、 MongoDB Search には指定されたバケットに該当しないファセット演算子の結果も含まれますが、 MongoDB Search はこれらの結果をバケットカウントに含めません。 | no |
| string | ファセットするフィールドパス。日付型としてインデックス付けされたフィールドを指定できます。 | はい |
| string | ファセットの型。値は | はい |
例
例
次の例では、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 バケットも指定します。
1 db.movies.aggregate([ 2 { 3 "$searchMeta": { 4 "facet": { 5 "operator": { 6 "range": { 7 "path": "released", 8 "gte": ISODate("2000-01-01T00:00:00.000Z"), 9 "lte": ISODate("2015-01-31T00:00:00.000Z") 10 } 11 }, 12 "facets": { 13 "yearFacet": { 14 "type": "date", 15 "path": "released", 16 "boundaries": [ISODate("2000-01-01"), ISODate("2005-01-01"), ISODate("2010-01-01"), ISODate("2015-01-01")], 17 "default": "other" 18 } 19 } 20 } 21 } 22 } 23 ])
1 [ 2 { 3 count: { lowerBound: Long('11922') }, 4 facet: { 5 yearFacet: { 6 buckets: [ 7 { 8 _id: ISODate('2000-01-01T00:00:00.000Z'), 9 count: Long('3028') 10 }, 11 { 12 _id: ISODate('2005-01-01T00:00:00.000Z'), 13 count: Long('3953') 14 }, 15 { 16 _id: ISODate('2010-01-01T00:00:00.000Z'), 17 count: Long('4832') 18 }, 19 { _id: 'other', count: Long('109') } 20 ] 21 } 22 } 23 } 24 ]
これらの結果の詳細については、「ファセット結果」を参照してください。
ファセットのフィールド型の比較
更新されたMongoDB Searchフィールドタイプは、古いタイプ(stringFacet、numberFacet、dateFacet)と比較して、ファセットをサポートする機能が改善されています。次の表では、機能における主な違いをまとめています。
ファセットカテゴリ | 更新されたフィールドタイプ | 古いファセットの型 | 重要な違い |
|---|---|---|---|
文字列 | 正規表現のサポート: | ||
Numeric | 配列サポート: | ||
日付 | 配列サポート: |
注意
古いフィールド型と更新されたフィールド型の両方が同じフィールドで定義されている場合は、古いファセット型が優先されます。例、フィールドに token と stringFacet の両方が定義されている場合、ファセット計算では stringFacet マッピングが使用されます。
ファセット結果
ファセットクエリの場合、 MongoDB Search は、定義されたファセット名と、そのファセットのバケットの配列とのマッピングを結果に返します。ファセット結果ドキュメントには、ファセットの結果バケットの配列である buckets オプションが含まれています。配列内の各ファセットバケットドキュメントには、次のフィールドがあります。
オプション | タイプ | 説明 |
|---|---|---|
| オブジェクト | このファセット バケットを識別するユニークな識別子。この値は、ファセットされるデータ型と一致します。 |
| 整数 | このファセットバケット内のドキュメントの数。 |
SEARCH_META 集計変数
$search ステージを使用してクエリを実行すると、 MongoDB Search はメタデータの結果を $$SEARCH_META 変数に保存し、検索結果のみを返します。サポートされているすべての集計パイプラインステージで $$SEARCH_META 変数を使用して、$search クエリのメタデータ結果を表示できます。
MongoDB では、検索結果とメタデータ結果の両方が必要な場合にのみ $$SEARCH_META 変数を使用することを推奨します。それ以外の場合は、次を使用します。
$searchステージを使用して、検索結果のみを取得します。$searchMetaステージを使用して、メタデータ結果のみを取得します。
制限
次の制限が適用されます。
ファセット クエリは単一のフィールドに対してのみ実行できます。フィールドのグループに対してファセット クエリを実行することはできません。
クラスター上のシャーディングされたコレクションに対してファセットクエリを実行することはできません。
例
$searchMetafacet次の例では、サンプルデータを使用します。メタデータ結果の例では、 を使用して クエリを実行し、結果内のメタデータのみを検索する方法を示します。メタデータと検索結果の例では、$search facetと$SEARCH_META 集計変数を使用して クエリを実行し、検索結果とメタデータ結果の両方を取得する方法を示します。returnScope の例は、embeddedDocuments 型を使用して動的にインデックス付けされたオブジェクトの配列内のネストされたフィールドをファセット方法を示しています。
sample_mflix.moviesコレクションのインデックス定義では、インデックスを作成するフィールドに対して次の内容を指定します。
{ "mappings": { "dynamic": false, "fields": { "directors": { "type": "token" }, "year": { "type": "number" }, "released": { "type": "date" } } } }
次のクエリでは、2000 年 1 月 1 日から 2015 年 1 月 31 日の間に公開された映画を検索して、directors とyear フィールドのメタデータをリクエストします。
1 db.movies.aggregate([ 2 { 3 "$searchMeta": { 4 "facet": { 5 "operator": { 6 "range": { 7 "path": "released", 8 "gte": ISODate("2000-01-01T00:00:00.000Z"), 9 "lte": ISODate("2015-01-31T00:00:00.000Z") 10 } 11 }, 12 "facets": { 13 "directorsFacet": { 14 "type": "string", 15 "path": "directors", 16 "numBuckets" : 7 17 }, 18 "yearFacet" : { 19 "type" : "number", 20 "path" : "year", 21 "boundaries" : [2000,2005,2010, 2015] 22 } 23 } 24 } 25 } 26 } 27 ])
1 [ 2 { 3 count: { lowerBound: Long('11922') }, 4 facet: { 5 yearFacet: { 6 buckets: [ 7 { _id: 2000, count: Long('3064') }, 8 { _id: 2005, count: Long('4035') }, 9 { _id: 2010, count: Long('4553') } 10 ] 11 }, 12 directorsFacet: { 13 buckets: [ 14 { _id: 'Takashi Miike', count: Long('26') }, 15 { _id: 'Johnnie To', count: Long('20') }, 16 { _id: 'Steven Soderbergh', count: Long('18') }, 17 { _id: 'Michael Winterbottom', count: Long('16') }, 18 { _id: 'Ridley Scott', count: Long('15') }, 19 { _id: 'Tyler Perry', count: Long('15') }, 20 { _id: 'Clint Eastwood', count: Long('14') } 21 ] 22 } 23 } 24 } 25 ]
sample_mflix.movies コレクション内にある次のアイテムがカウントされて、結果に表示されます。
MongoDB Search によりクエリに返された、2000(下限)から 2015(排他的上限)の間の映画の本数
MongoDB Search によりクエリに返された、各役員の映画の本数
これらの結果の詳細については、「ファセット結果」を参照してください。
sample_mflix.moviesコレクションのインデックス定義では、インデックスを作成するフィールドに対して次の内容を指定します。
{ "mappings": { "dynamic": false, "fields": { "genres": { "type": "token" }, "released": { "type": "date" } } } }
次のクエリは、$search ステージを使用して、1999 年 7 月 01 日頃に公開された映画を検索します。クエリには、次のサブパイプライン ステージを使用して入力ドキュメントを処理する $facet ステージが含まれています。
$projectステージで、docs出力フィールドのtitleフィールドとreleasedフィールドを除くドキュメント内のすべてのフィールドを除外します。$limitステージでは、次を実行できます。$searchステージ出力を2ドキュメントに制限しますmeta出力フィールドの1ドキュメントへの出力を制限します
注意
結果が 16 MB のドキュメントに収まるように、制限を小さくする必要があります。
$replaceWithステージで、$$SEARCH_META変数に保存されているメタデータの結果をmeta出力フィールドに含める
クエリには、meta フィールドを追加するための $set ステージも含まれています。
注意
次のクエリのメタデータ結果を表示するには、 MongoDB Search がクエリに一致するドキュメントを返す必要があります。
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "facet": { 5 "operator": { 6 "near": { 7 "path": "released", 8 "origin": ISODate("1999-07-01T00:00:00.000+00:00"), 9 "pivot": 7776000000 10 } 11 }, 12 "facets": { 13 "genresFacet": { 14 "type": "string", 15 "path": "genres" 16 } 17 } 18 } 19 } 20 }, 21 { "$limit": 2 }, 22 { 23 "$facet": { 24 "docs": [ 25 { "$project": 26 { 27 "title": 1, 28 "released": 1 29 } 30 } 31 ], 32 "meta": [ 33 {"$replaceWith": "$$SEARCH_META"}, 34 {"$limit": 1} 35 ] 36 } 37 }, 38 { 39 "$set": { 40 "meta": { 41 "$arrayElemAt": ["$meta", 0] 42 } 43 } 44 } 45 ])
1 [ 2 { 3 docs: [ 4 { 5 _id: ObjectId('573a1393f29313caabcde1ae'), 6 title: 'Begone Dull Care', 7 released: ISODate('1999-07-01T00:00:00.000Z') 8 }, 9 { 10 _id: ObjectId('573a13a9f29313caabd2048a'), 11 title: 'Fara' released: ISODate('1999-07-01T00:00:00.000Z') 12 } 13 ], 14 meta: { 15 count: { lowerBound: Long('20878') }, 16 facet: { 17 genresFacet: { 18 buckets: [ 19 { _id: 'Drama', count: Long('12149') }, 20 { _id: 'Comedy', count: Long('6436') }, 21 { _id: 'Romance', count: Long('3274') }, 22 { _id: 'Crime', count: Long('2429') }, 23 { _id: 'Thriller', count: Long('2400') }, 24 { _id: 'Action', count: Long('2349') }, 25 { _id: 'Adventure', count: Long('1876') }, 26 { _id: 'Documentary', count: Long('1755') }, 27 { _id: 'Horror', count: Long('1432') }, 28 { _id: 'Biography', count: Long('1244') } 29 ] 30 } 31 } 32 } 33 } 34 ]
これらの結果の詳細については、「ファセット結果」を参照してください。
sample_training.companiesコレクションのインデックス定義は、funding_rounds フィールドをembeddedDocuments 型としてインデックス化します。オブジェクトの 配列内のすべてのフィールドを動的にインデックス化し、funding_rounds raised_currency_coderaised_amountfunding_roundsstoredSource オプションを使用してオブジェクトの 配列に フィールドと フィールドを保存します。
{ "mappings": { "dynamic": false, "fields": { "funding_rounds": { "type": "embeddedDocuments", "dynamic": true, "storedSource": { "include": [ "raised_currency_code", "raised_amount" ] } } } } }
以下のクエリでは、
text(MongoDB Search 演算子)を使用して、USDで発生したファイルを検索します。returnScopes
embeddedDocumentsfunding_roundsオプションを使用して、クエリコンテキストを という名前の フィールドに設定します。returnScopeを使用するには、クエリは次のようになります。保存されたソース フィールドを返すには必須である returnStoredSource オプションを指定します。
オブジェクトの
funding_rounds配列内のraised_amountフィールドをファセットします。クエリでは 3 つのバケットを指定します。5000000 (このバケットの下限値を含む)
5250000: 5000000 バケットの 排他的上限であり、このバケットの下限
5500000: 5250000 の排他的上限
1 db.companies.aggregate([ 2 { 3 "$searchMeta": { 4 "returnStoredSource": true, 5 "returnScope": { 6 "path": "funding_rounds" 7 }, 8 "facet": { 9 "operator": { 10 "text": { 11 "path": "funding_rounds.raised_currency_code", 12 "query": "USD" 13 } 14 }, 15 "facets": { 16 "raisedAmountFacet": { 17 "type": "number", 18 "path": "funding_rounds.raised_amount", 19 "boundaries": [5000000, 5250000, 5500000] 20 } 21 } 22 } 23 } 24 } 25 ])
1 [ 2 { 3 count: { lowerBound: Long('5329') }, 4 facet: { 5 raisedAmountFacet: { 6 buckets: [ 7 { _id: 5000000, count: Long('251') }, 8 { _id: 5250000, count: Long('32') } 9 ] 10 } 11 } 12 } 13 ]
上記のMongoDB Search の結果では、ファセット数は親ではなく埋め込まれた子ドキュメントに基づいています。
学び続ける
詳しくは、 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 分