Docs Menu
Docs Home
/ /

facet (MongoDB Search 演算子)

facet

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

は、$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
}
}
フィールド
タイプ
必須
説明

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

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

文字列

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

Numeric

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

日付

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

注意

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

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

オプション
タイプ
説明

_id

オブジェクト

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

count

整数

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

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

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

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

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

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

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

  • クラスター上のシャーディングされたコレクションに対してファセットクエリを実行することはできません。

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

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

戻る

exists

項目一覧