定義
facetfacetコレクターは、指定されたファセット フィールドの値または範囲で結果をグループ化し、各グループのカウントを返します。は、
$search$searchMetaステージと ステージの両方で使用できます。facetMongoDB、クエリのみのメタデータ結果を検索するために、facet$searchMetaステージで を使用することを推奨しています。$searchステージを使用してメタデータ結果とクエリ結果を取得するには、$$SEARCH_META集計変数を使用する必要があります。詳しくは、SEARCH_META集計変数を参照してください。embeddedDocuments フィールド型定義で storedSource を定義すると、 returnStoredSource とともに returnScope を使用して、オブジェクト配列内のネストされたフィールドにファセットを設定できます。それ以外の場合は、ルートの embeddedDocuments 型フィールドに対してのみファセットを設定できます。ファセットの例:
ネストされたフィールドがオブジェクト配列内に含まれている場合を参照してください。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 } }
フィールド
フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
| ドキュメント | はい | 各ファセットのデータをバケット化するための 情報 。少なくとも 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検索フィールドタイプは、古いタイプ(stringFacet、numberFacet、dateFacet)と比較して、ファセットをサポートする機能が改善されています。次の表では、機能における主な違いをまとめています。
ファセットカテゴリ | 更新されたフィールドタイプ | 古いファセットの型 | 重要な違い |
|---|---|---|---|
文字列 | stringFacet(廃止予定) | 正規表現のサポート: | |
Numeric | numberFacet(廃止予定) | 配列サポート: | |
日付 | dateFacet(廃止予定) | 配列サポート: |
注意
古いフィールド型と更新されたフィールド型の両方が同じフィールドで定義されている場合は、古いファセット型が優先されます。例、フィールドに token と stringFacet の両方が定義されている場合、ファセット計算では stringFacet マッピングが使用されます。
ファセット結果
ファセットクエリの場合、 MongoDB Search は、定義されたファセット名と、そのファセットのバケットの配列とのマッピングを結果に返します。ファセット結果ドキュメントには、ファセットの結果バケットの配列である buckets オプションが含まれています。配列内の各ファセットバケットドキュメントには、次のフィールドがあります。
オプション | タイプ | 説明 |
|---|---|---|
| オブジェクト | このファセット バケットを識別するユニークな識別子。この値は、ファセットされるデータ型と一致します。 |
| 整数 | このファセットバケット内のドキュメントの数。 |
複数選択ファセット
MongoDB Search を使用すると、同じファセット内の複数のバケットを同時に表示および選択できます。通常、ファセット内でバケットを選択すると、その選択に従って検索結果がフィルタリングされ、すべてのファセットのカウントが変更されます。
例
sample_airbnb.listingsコレクションのインデックス定義で、次のフィールドのファセットが指定されているとします。
cancellation_policyroom_typeaccommodates
cancellation_policyファセットには次のバケットがあります。
flexiblemoderatestrict_14_with_grace_periodsuper_strict_30super_strict_60
それぞれの結果の数は独自です。moderate cancellation_policy を検索すると、他の 4 つのバケットのカウントは 0 になります。さらに、room_type および accommodates ファセットのバケットのカウントは、flexible cancellation_policy も持つ各バケットの結果の数に減少します。
ファセットが検索結果のカウントに与える影響をより細かく制御する必要があるシナリオでは、ファセット クエリで doesNotAffectプロパティを使用して複数選択のファセットを有効にします。これらのファセットは引き続き結果をフィルタリングしますが、クエリは結果数を変更しません。
例
moderate cancellation_policy があるドキュメントのsample_airbnb.listings コレクションに対するクエリを検討します。doesNotAffect の値を cancellation_policy に指定すると、cancellation_policy ファセットのバケットのカウントは変更されませんが、他のファセットのバケットの結果カウントは、同様に moderatecancellation_policy を持つ各バケットの結果の数に減ります。
詳細については、複数選択ファセットの例を参照してください。
最後に、多くのファセットを持つユースケースでは、特定のファセットに影響する他のフィルターを制限すると便利です。これを行うには、その他のフィールドのファセットを含む、任意のフィルターの doesNotAffect プロパティのファセットを指定します。これにより、より迅速に選択肢を絞り込むセレクションを一目で確認できます。
例
accommodates 値が 3 であるドキュメントの sample_airbnb.listingsコレクションに対するクエリを検討します。cancellation_policyの doesNotAffect 値を指定すると、room_type バケットの結果カウントは、3 人にも対応する各バケットの結果数に減少しますが、cancellation_policy のバケットの結果カウントは減少します。は影響を受けません。
詳細については、「ファセット間フィルター除外の例」を参照してください。
SEARCH_META 集計変数
$search ステージを使用してクエリを実行すると、 MongoDB Search はメタデータの結果を $$SEARCH_META 変数に保存し、検索結果のみを返します。サポートされているすべての集計パイプラインステージで $$SEARCH_META 変数を使用して、$search クエリのメタデータ結果を表示できます。
MongoDB では、検索結果とメタデータ結果の両方が必要な場合にのみ $$SEARCH_META 変数を使用することを推奨します。それ以外の場合は、次を使用します。
$searchステージを使用して、検索結果のみを取得します。$searchMetaステージを使用して、メタデータ結果のみを取得します。
制限
次の制限が適用されます。
ファセット クエリは単一のフィールドに対してのみ実行できます。フィールドのグループに対してファセット クエリを実行することはできません。
例
The following examples use the sample data. The metadata results example demonstrates how to run a $searchMeta query with facet to retrieve only the metadata in the results. The metadata and search results example demonstrates how to run a $search query with facet and the $SEARCH_META aggregation variable to retrieve both the search and metadata results. The returnScope example demonstrates how to facet on nested fields in an array of objects dynamically indexed using the embeddedDocuments type.
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 オブジェクト配列内のすべてのフィールドに動的にインデックスを付け、storedSourceオプションを使用してfunding_rounds オブジェクト配列内にraised_currency_code とraised_amount フィールドを保存します。
{ "mappings": { "dynamic": false, "fields": { "funding_rounds": { "type": "embeddedDocuments", "dynamic": true, "storedSource": { "include": [ "raised_currency_code", "raised_amount" ] } } } } }
以下のクエリでは、
text(MongoDB 演算子)を使用して、USDで調達された資金を検索します。returnScope オプションを使用して、クエリ コンテキストを
funding_roundsという名前のembeddedDocumentsフィールドに設定します。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 の結果では、ファセット数は親ではなく、埋め込まれた子ドキュメントに基づいています。
次の sample_airbnb.listingsAndReviews コレクションのインデックス定義は、すべての動的にインデックス可能なフィールドを自動的にインデックスし、cancellation_policy、room_type、price フィールドをファセット検索用に設定します。
{ "mappings": { "dynamic": false, "fields": { "cancellation_policy": { "type": "token" }, "room_type": { "type": "token" }, "accommodates": { "type": "number" } } } }
次のクエリは、 $searchMetaステージを使用して次のアクションを実行します。
cancellation_policy、roomType、accommodatesフィールドをファセットします。cancellation_policyファセットには次のバケットがあります。"strict_14_with_grace_period""moderate""flexible""super_strict_30""super_strict_60"
room_typeファセットには次のバケットがあります。"Entire home/apt""Private room""Shared room"
このクエリは、
accommodatesファセットを次のバケットに分割します。1(このバケットの下限値を含む)2、1バケットの上限(排他的)であり、このバケットの下限(包括的)。4、2バケットの上限(排他的)であり、このバケットの下限(包括的)。8(4バケットの排他的上限)
compoundにテキスト を含む必要があるリストをnew york citydescription演算子で検索し、リストの結果をmoderatecancellation_policyでフィルターします。doesNotAffect設定により、moderatecancellation_policyによるフィルターによってファセット内の他のバケットのカウントは変更されなくなります。"strict_14_with_grace_period"、"flexible"、"super_strict_30"、"super_strict_60"のカウントはゼロ以外の値です。
1 db.listingsAndReviews.aggregate([ 2 { 3 $searchMeta: { 4 facet: { 5 facets: { 6 accommodatesFacet: { 7 path: "accommodates", 8 type: "number", 9 boundaries: [1,2,4,8], 10 }, 11 cancellationFacet: { 12 path: "cancellation_policy", 13 type: "string", 14 }, 15 roomTypeFacet: { 16 path: "room_type", 17 type: "string", 18 } 19 }, 20 operator: { 21 compound: { 22 must: [ 23 { 24 text: { 25 path: "description", 26 query: "new york city", 27 }, 28 }, 29 ], 30 filter: [ 31 { 32 equals: { 33 path: "cancellation_policy", 34 value: "moderate", 35 doesNotAffect: 36 "cancellationFacet", 37 }, 38 }, 39 ], 40 }, 41 }, 42 }, 43 } 44 }, 45 ]
1 [ 2 { 3 count: { lowerBound: Long('531') }, 4 facet: { 5 accomodatesFacet: { 6 buckets: [ 7 { _id: "1", count: Long('25') }, 8 { _id: "2", count: Long('270') }, 9 { _id: "4", count: Long('204') }, 10 ] 11 }, 12 cancellationFacet: { 13 buckets: [ 14 { _id: "strict_14_with_grace_period", count: Long('849') }, 15 { _id: "moderate", count: Long('531') }, 16 { _id: "flexible", count: Long('380') }, 17 { _id: "super_strict_60", count: Long('25') } 18 { _id: "super_strict_30", count: Long('380') } 19 ] 20 }, 21 roomTypeFacet: { 22 buckets: [ 23 { _id: "Entire home/apt", count: Long('369') }, 24 { _id: "Private room", count: Long('159') }, 25 { _id: "Shared room", count: Long('3') }, 26 ] 27 } 28 } 29 } 30 ]
クエリが moderate の値でフィルタリングしているにもかかわらず、cancellationFacet のバケットのカウントは 0 に減少しないことがわかります。
sample_airbnb.listingsAndReviewsコレクションの次のインデックス定義は、cancellation_policy、room_type、price フィールドにインデックスを作成し、ファセット検索を有効にします。
{ "mappings": { "dynamic": true, "fields": { "cancellation_policy": { "type": "token" }, "room_type": { "type": "token" }, "accommodates": { "type": "number" } } } }
以下のクエリでは、
descriptionにテキストnew york cityが含まれ、かつcancellation_policyがmoderateであるリストを検索します。cancellation_policy、roomType、accommodatesフィールドのファセット。cancellation_policyおよびroomTypeファセットにはそれぞれ3つのバケットがあり、コレクション全体のこれらのフィールドの3つの一意の値に対応します。このクエリは、accommodatesファセットを以下のバケットに分割します。1(このバケットの下限値を含む)2、1バケットの上限(排他的)であり、このバケットの下限(包括的)。4、2バケットの上限(排他的)であり、このバケットの下限(包括的)。8(4バケットの排他的上限)
compound.filterのequals演算子でdoesNotAffectプロパティをaccommodatesFacetに設定します。これにより、accommodatesファセット内のバケットはフィルタリングから除外されます。その結果、moderatecancellation_policyでフィルタリングすると、cancellation_policyファセットの他のバケットのカウントは0に減少し、roomTypeファセットのバケットの数は減少しますが、 のバケットの数はaccommodatesファセットは変更されていません。これにより、さまざまなファセットに与えるフィルター処理の影響を比較できます。
1 db.listingsAndReviews.aggregate([ 2 { 3 $searchMeta: { 4 facet: { 5 facets: { 6 accommodatesFacet: { 7 path: "accommodates", 8 type: "number", 9 boundaries: [1,2,4,8], 10 }, 11 cancellationFacet: { 12 path: "cancellation_policy", 13 type: "string", 14 }, 15 roomTypeFacet: { 16 path: "room_type", 17 type: "string", 18 } 19 }, 20 operator: { 21 compound: { 22 must: [ 23 { 24 text: { 25 path: "description", 26 query: "new york city", 27 }, 28 }, 29 ], 30 filter: [ 31 { 32 equals: { 33 path: "cancellation_policy", 34 value: "moderate", 35 doesNotAffect: 36 "accommodatesFacet", 37 }, 38 }, 39 ], 40 }, 41 }, 42 }, 43 }, 44 }, 45 ]
1 [ 2 { 3 count: { lowerBound: Long('531') }, 4 facet: { 5 accomodatesFacet: { 6 buckets: [ 7 { _id: "1", count: Long('25') }, 8 { _id: "2", count: Long('270') }, 9 { _id: "4", count: Long('204') }, 10 ] 11 }, 12 cancellationFacet: { 13 buckets: [ 14 { _id: "flexible", count: Long('XXX') }, 15 { _id: "moderate", count: Long('531') }, 16 { _id: "strict_14_with_grace_period", count: Long('XXX') }, 17 ] 18 }, 19 roomTypeFacet: { 20 buckets: [ 21 { _id: "Entire home/apt", count: Long('369') }, 22 { _id: "Private room", count: Long('159') }, 23 { _id: "Shared room", count: Long('3') }, 24 ] 25 } 26 } 27 } 28 ]
学び続ける
詳しくは、 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 分