Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

facet (MongoDB Search 演算子)

facet

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

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

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 ステージを使用して、メタデータ結果のみを取得します。

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

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

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.

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