facet
定義
facet
facet
コレクターは、指定されたファセット フィールドの値または範囲で結果をグループ化し、各グループのカウントを返します。は、
$search
$searchMeta
ステージと ステージの両方で使用できます。facet
MongoDB、クエリのみのメタデータ結果を検索するために、facet
$searchMeta
ステージで を使用することを推奨しています。$search
ステージを使用してメタデータ結果とクエリ結果を取得するには、$$SEARCH_META
集計変数を使用する必要があります。詳しくは、SEARCH_META
集計変数を参照してください。
制限
explain を使用して facet
クエリを実行することはできません。
構文
facet
の構文は次のとおりです。
{ "$searchMeta"|"$search": { "index": <index name>, // optional, defaults to "default" "facet": { "operator": { <operator-specifications> }, "facets": { <facet-definitions> } } } }
フィールド
フィールド | タイプ | 必須 | 説明 |
---|---|---|---|
| ドキュメント | はい | 各ファセットのデータをバケット化するための 情報 。少なくとも 1 つの ファセット定義 を指定する必要があります。 |
| ドキュメント | no | ファセットを実行するために使用する 演算子。省略した場合、Atlas Search はコレクション内のすべてのドキュメントに対してファセットを実行します。 |
ファセットの定義
ファセット定義ドキュメントには、ファセット名とファセットの種類に固有のオプションが含まれています。Atlas Search は次の型のファセットをサポートしています。
文字列ファセット
文字列ファセットを使用すると、指定された文字列フィールド内の最も頻繁に出現する文字列値に基づいて、Atlas 検索結果を絞り込むことができます。文字列フィールドは 文字列ファセット としてインデックス付けする必要があることに注意してください。埋め込まれたドキュメント内の文字列フィールドをファセットするには、親フィールドも ドキュメント型としてインデックス付けする必要があります。配列や埋め込みドキュメントの文字列をファセットすると、Atlas 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
フィールドは number 型としてインデックス付けされます。
{ "mappings": { "dynamic": false, "fields": { "genres": { "type": "stringFacet" }, "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 は非推奨になりました。代わりに数値を使用してください。
数値ファセットを使用すると、結果を個別の数値の範囲に分割して、検索結果内の数値の頻度を判断できます。配列や埋め込みドキュメントの数値をファセット化する際、Atlas 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 | 指定された境界内に含まれない、演算子から返されたドキュメントをカウントする追加のバケットの名前。省略した場合、Atlas 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 は非推奨になりました。日付を代わりに使用してください。
日付ファセットを使用すると、日付に基づいて検索結果を絞り込むことができます。配列や埋め込みドキュメントの日付でファセットを行うと、Atlas Searchは一致するルートドキュメントの数に基づいてファセット数を返します。
構文
日付ファセットの構文は次のとおりです。
{ "$searchMeta": { "facet":{ "operator": { <operator-specification> }, "facets": { "<facet-name>" : { "type" : "date", "path" : "<field-path>", "boundaries" : <array-of-dates>, "default": "<bucket-name>" } } } } }
オプション
オプション | タイプ | 説明 | 必須 |
---|---|---|---|
| 数字の配列 | 各バケットの境界を指定する日付値のリスト。以下を指定する必要があります:
隣接する各値のペアは、バケットの包括的な下限と排他的な上限として機能します。 | はい |
| string | 指定された境界内に含まれない、演算子から返されたドキュメントをカウントする追加のバケットの名前。省略した場合、Atlas Search には指定されたバケットに該当しないファセット演算子の結果も含まれますが、Atlas 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 ]
これらの結果の詳細については、「ファセット結果」を参照してください。
ファセット結果
ファセット クエリの場合、Atlas Search は、定義されたファセット名と、そのファセットのバケットの配列とのマッピングを結果に返します。ファセット結果ドキュメントには、ファセットの結果バケットの配列である buckets
オプションが含まれています。配列内の各ファセット バケット ドキュメントには、次のフィールドがあります。
オプション | タイプ | 説明 |
---|---|---|
| オブジェクト | このファセット バケットを識別するユニークな識別子。この値は、ファセットされるデータ型と一致します。 |
| 整数 | このファセット バケット内のドキュメントの数。 |
SEARCH_META
集計変数
$search
ステージを使用してクエリを実行すると、Atlas Search はメタデータの結果を $$SEARCH_META
変数に保存し、検索結果のみを返します。サポートされているすべての集計パイプライン ステージで $$SEARCH_META
変数を使用して、$search
クエリのメタデータ結果を表示できます。
MongoDB では、検索結果とメタデータ結果の両方が必要な場合にのみ $$SEARCH_META
変数を使用することを推奨します。それ以外の場合は、次を使用します。
$search
ステージを使用して、検索結果のみを取得します。$searchMeta
ステージを使用して、メタデータ結果のみを取得します。
制限
次の制限が適用されます。
ファセット クエリは単一のフィールドに対してのみ実行できます。フィールドのグループに対してファセット クエリを実行することはできません。
MongoDB v6.0 を実行しているクラスター上のシャーディングされたコレクションに対してのみファセット クエリを実行できます。
例
次の例では、sample_mflix.movies
コレクションを使用しています。メタデータ結果の例では、facet
を使用して $searchMeta
クエリを実行し、結果内のメタデータのみを検索する方法を示します。メタデータと検索結果の例では、facet
と $SEARCH_META
集計変数を使用して $search
クエリを実行し、検索結果とメタデータ結果の両方を検索する方法を示します。
インデックス定義では、インデックスを作成するフィールドに対して次の内容を指定します。
フィールド名 | データ型 |
---|---|
| |
| |
|
{ "mappings": { "dynamic": false, "fields": { "directors": { "type": "stringFacet" }, "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
コレクション内にある次のアイテムがカウントされて、結果に表示されます。
Atlas Search によりクエリに返された、2000 年(下限)から 2015 年(排他的上限)の間の映画の本数
Atlas Search によりクエリに返された、各監督の映画の本数
インデックス定義では、インデックスを作成するフィールドに対して次の内容を指定します。
フィールド名 | データ型 |
---|---|
| |
|
{ "mappings": { "dynamic": false, "fields": { "genres": { "type": "stringFacet" }, "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
ステージも含まれています。
注意
次のクエリのメタデータ結果を表示するには、Atlas 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', 12 released: ISODate('1999-07-01T00:00:00.000Z') 13 } 14 ], 15 meta: { 16 count: { lowerBound: Long('20878') }, 17 facet: { 18 genresFacet: { 19 buckets: [ 20 { _id: 'Drama', count: Long('12149') }, 21 { _id: 'Comedy', count: Long('6436') }, 22 { _id: 'Romance', count: Long('3274') }, 23 { _id: 'Crime', count: Long('2429') }, 24 { _id: 'Thriller', count: Long('2400') }, 25 { _id: 'Action', count: Long('2349') }, 26 { _id: 'Adventure', count: Long('1876') }, 27 { _id: 'Documentary', count: Long('1755') }, 28 { _id: 'Horror', count: Long('1432') }, 29 { _id: 'Biography', count: Long('1244') } 30 ] 31 } 32 } 33 } 34 } 35 ]
これらの結果の詳細については、「ファセット結果」を参照してください。