Docs Menu

facet

facet

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

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

facets

ドキュメント

はい

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

operator

ドキュメント

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

numBuckets

整数

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

no

path

string

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

はい

type

string

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

はい

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

{
"mappings": {
"dynamic": false,
"fields": {
"genres": {
"type": "stringFacet"
},
"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]

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

重要

数値ファセットを使用すると、結果を個別の数値の範囲に分割して、検索結果内の数値の頻度を判断できます。配列や埋め込みドキュメントの数値をファセット化する際、Atlas 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

指定された境界内に含まれない、演算子から返されたドキュメントをカウントする追加のバケットの名前。省略した場合、Atlas 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]

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

重要

日付ファセットを使用すると、日付に基づいて検索結果を絞り込むことができます。配列や埋め込みドキュメントの日付でファセットを行うと、Atlas 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

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

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

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

オプション
タイプ
説明

_id

オブジェクト

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

count

整数

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

$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 クエリを実行し、検索結果とメタデータ結果の両方を検索する方法を示します。

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

フィールド名
データ型

directors

year

released

{
"mappings": {
"dynamic": false,
"fields": {
"directors": {
"type": "stringFacet"
},
"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 コレクション内にある次のアイテムがカウントされて、結果に表示されます。

  • Atlas Search によりクエリに返された、2000 年(下限)から 2015 年(排他的上限)の間の映画の本数

  • Atlas Search によりクエリに返された、各監督の映画の本数

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

フィールド名
データ型

genres

released

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

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',
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]

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