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

facet (MongoDB Search 演算子)

facet

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

$search ステージと $searchMeta ステージの両方で facet を使用できます。MongoDB では、クエリのみのメタデータ結果を取得するために、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
}
}
フィールド
タイプ
必須
説明

facets

ドキュメント

はい

各ファセットのデータをバケット化するための情報。少なくとも 1 つのファセット定義を指定する必要があります。

operator

ドキュメント

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>,
}
}
}
}
}
オプション
タイプ
説明
必須

numBuckets

整数

結果で返されるファセットカテゴリの最大数。値は 1000 以下である必要があります。指定した場合、データがリクエスト数よりも少ないカテゴリにグループ化されている場合は、 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 年までの映画を検索し、各ジャンルの映画の数を検索します。

1db.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>"
}
}
}
}
}
オプション
タイプ
説明
必須

boundaries

数字の配列

各バケットの境界を指定する昇順の数値リスト少なくとも 2 つの境界を指定する必要があります。それらの境界は、1,000([2, 1000])以下である必要があります。隣接する各値のペアは、バケットの下限と排他的上限として機能します。次の BSON types の値の任意の組み合わせを指定できます。

  • 32 ビット整数(int32

  • 64 ビット整数(int64

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

はい

default

string

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

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(このバケットの下限値を含む)

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

  • 20001990 バケットの排他的上限)

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

1db.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>"
}
}
}
}
}
オプション
タイプ
説明
必須

boundaries

数字の配列

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

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

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

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

はい

default

string

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

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-012000-01-01 バケットの上限(排他的)とこのバケットの下限(包括的))

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

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

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

1db.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検索フィールドタイプは、古いタイプ(stringFacetnumberFacetdateFacet)と比較して、ファセットをサポートする機能が改善されています。次の表では、機能における主な違いをまとめています。

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

文字列

stringFacet(廃止予定)

正規表現のサポート: token タイプは、ファセットバケットを変換する正規表現をサポートします。例、normalizer: lowercase では、「ADDAS」と「admin」は同じバケットにカウントされますが、stringFacet はそれらを別々のバケットとして扱います。

Numeric

numberFacet(廃止予定)

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

日付

dateFacet(廃止予定)

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

注意

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

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

オプション
タイプ
説明

_id

オブジェクト

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

count

整数

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

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 ファセットのバケットのカウントは、flexible cancellation_policy も持つ各バケットの結果の数に減少します。

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

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

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

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

accommodates 値が 3 であるドキュメントの sample_airbnb.listingsコレクションに対するクエリを検討します。cancellation_policydoesNotAffect 値を指定すると、room_type バケットの結果カウントは、3 人にも対応する各バケットの結果数に減少しますが、cancellation_policy のバケットの結果カウントは減少します。は影響を受けません。

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

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

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

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

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

次の制限が適用されます。

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

以下の例ではサンプルデータを使用しています。メタデータ結果の例では、facet を使用して $searchMeta クエリを**実行する**し、結果内のメタデータのみを**検索する**方法を示します。メタデータと検索結果の例では、facet$SEARCH_META 集計変数を使用して $search クエリを**実行する**し、検索結果とメタデータ結果の両方を**検索する**方法を示します。returnScope の例では、embeddedDocuments 型を使用して動的にインデックス化されたオブジェクト配列内のネストされたフィールドでファセットを作成する方法を示しています。

チュートリアルの前の手順を完了し、依存関係をインストールします。

sample_mflix.moviesコレクションのインデックス定義では、インデックスを作成するフィールドに対して次の内容を指定します。

フィールド名
データ型

directors

year

released

{
"mappings": {
"dynamic": false,
"fields": {
"directors": {
"type": "token"
},
"year": {
"type": "number"
},
"released": {
"type": "date"
}
}
}
}

次のクエリでは、2000 年 1 月 1 日から 2015 年 1 月 31 日の間に公開された映画を検索して、directorsyear フィールドのメタデータをリクエストします。

1db.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 によりクエリに返された、各役員の映画の本数

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

$search を使用して検索し、$$SEARCH_META 変数を用いて検索結果とメタデータの両方を検索します。

sample_mflix.moviesコレクションのインデックス定義では、インデックスを作成するフィールドに対して次の内容を指定します。

フィールド名
データ型

genres

released

{
"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 がクエリに一致するドキュメントを返す必要があります。

1db.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]

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

embeddedDocuments 内の子フィールドでファセットとファセットを使用して検索します。

sample_training.companies コレクションのインデックス定義は、funding_rounds フィールドを embeddedDocuments 型としてインデックスします。funding_rounds オブジェクト配列内のすべてのフィールドに動的にインデックスを付け、storedSourceオプションを使用してfunding_rounds オブジェクト配列内にraised_currency_coderaised_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 の排他的上限

1db.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 の結果では、ファセット数は親ではなく、埋め込まれた子ドキュメントに基づいています。

ファセットフィルタリングのより詳細な制御には、 existsNotAction を使用して検索します。

次の sample_airbnb.listingsAndReviews コレクションのインデックス定義は、すべての動的にインデックス可能なフィールドを自動的にインデックスし、cancellation_policyroom_typeprice フィールドをファセット検索用に設定します。

{
"mappings": {
"dynamic": true,
"fields": {
"cancellation_policy": {
"type": "token"
},
"room_type": {
"type": "token"
},
"accommodates": {
"type": "number"
}
}
}
}

次のクエリは、 $searchMetaステージを使用して次のアクションを実行します。

  • cancellation_policyroomTypeaccommodates フィールドをファセットします。

    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(このバケットの下限値を含む)

    • 21 バケットの上限(排他的)であり、このバケットの下限(包括的)。

    • 42 バケットの上限(排他的)であり、このバケットの下限(包括的)。

    • 84 バケットの排他的上限)

  • compoundにテキスト を含む必要があるリストをnew york city description演算子で検索し、リストの結果をmoderatecancellation_policy でフィルターします。doesNotAffect 設定により、moderate cancellation_policy によるフィルターによってファセット内の他のバケットのカウントは変更されなくなります。 "strict_14_with_grace_period""flexible""super_strict_30""super_strict_60" のカウントはゼロ以外の値です。

1db.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 accommodatesFacet: {
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('11') }
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 に減少しないことがわかります。

クエリ済みフィールド以外のファセットで doesNotAffect を使用して検索します。

sample_airbnb.listingsAndReviewsコレクションの次のインデックス定義は、cancellation_policyroom_typeprice フィールドにインデックスを作成し、ファセット検索を有効にします。

{
"mappings": {
"dynamic": true,
"fields": {
"cancellation_policy": {
"type": "token"
},
"room_type": {
"type": "token"
},
"accommodates": {
"type": "number"
}
}
}
}

以下のクエリでは、

  • description にテキスト new york city が含まれ、かつ cancellation_policymoderate であるリストを検索します。

  • cancellation_policyroomTypeaccommodatesフィールドのファセット。

    cancellation_policy および roomType ファセットにはそれぞれ3つのバケットがあり、コレクション全体のこれらのフィールドの3つの一意の値に対応します。このクエリは、accommodates ファセットを以下のバケットに分割します。

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

    • 21 バケットの上限(排他的)であり、このバケットの下限(包括的)。

    • 42 バケットの上限(排他的)であり、このバケットの下限(包括的)。

    • 84 バケットの排他的上限)

  • compound.filterequals 演算子で doesNotAffectプロパティを accommodatesFacet に設定します。これにより、accommodatesファセット内のバケットはフィルタリングから除外されます。その結果、moderatecancellation_policy でフィルタリングすると、cancellation_policyファセットの他のバケットのカウントは 0 に減少し、 roomTypeファセットのバケットの数は減少しますが、 のバケットの数はaccommodatesファセットは変更されていません。これにより、さまざまなファセットに与えるフィルター処理の影響を比較できます。

1db.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 accommodatesFacet: {
6 buckets: [
7 { _id: 1, count: Long('141') },
8 { _id: 2, count: Long('834') },
9 { _id: 4, count: Long('703') }
10 ]
11 },
12 cancellationFacet: {
13 buckets: [
14 { _id: 'moderate', count: Long('531') }
15 ]
16 },
17 roomTypeFacet: {
18 buckets: [
19 { _id: 'Entire home/apt', count: Long('369') },
20 { _id: 'Private room', count: Long('159') },
21 { _id: 'Shared room', count: Long('3') }
22 ]
23 }
24 }
25 }
26]

詳しくは、 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 分