MongoDB7.0.5 +を実行中Atlas クラスターでは、Atlas Search を使用して$search クエリ結果を参照点の前後で順番に取得します。$searchsearchAfter またはsearchBefore オプションを使用して結果を順番に走査し、アプリケーション内で「次のページ」と「前のページ」関数を構築します。
使用法
ページ分割された結果を検索するには、次の手順を実行します。
クエリを実行したいフィールドにインデックスを作成します。
参照点を返す
$searchクエリを実行します。 詳しくは、「 参照点を取得する 」を参照してください。後続の
$searchクエリで参照点を使用して、結果内に次または前のドキュメント セットを検索します。"Next Page" 関数を構築するための結果の検索の詳細については、「特定の参照点の後の検索 」を参照してください。
「前のページ」関数を構築するための結果の検索の詳細については、「特定の参照点の前の検索 」を参照してください。
結果のページに移動するには、
$skipと$limitを$searchsearchAfterまたはsearchBeforeオプションと組み合わせて使用します。 たとえば、ページ3からページ5に移動し、1 ページあたり10の結果に移動するには、次の操作を実行します。ページ3の最後の結果の参照点を持つ
searchAfterを使用して結果を取得します(結果30 )。ページ4の10結果(結果31 - 40 )をスキップするには
$skipを使用し、結果を10ドキュメントに制限するには、$limitを使用します。ページ5の結果を返します(結果41 - 50 )。
ここで、
$skipをsearchAfterオプションとともに使用すると、クエリが最適化され、結果の 1 ページのみをスキップします(10件のドキュメント)。比較すると、$searchsearchAfterオプションを使用せずに$skipを使用すると、クエリは結果の 4 ページ(40件のドキュメント)をスキップします。詳細については、「searchAfter と $skip を使用してページ 2 からページ 5 へジャンプする」をご覧ください。
Considerations
複数のドキュメントが同じ値を持つフィールドでソートすると、同順位となります。 MongoDB、関連付けられたクエリ結果の順序が保証されていないため、searchAfter と searchBefore を使用すると重複や不整合が発生する可能性があります。 決定的な検索動作を確保するには、次の原則を適用します。
関連性スコアが同値になるのを防ぐために、クエリを一意のフィールドでソートします。
非 一意のフィールドで主にソートする場合は、タイブレークとして機能するために一意のフィールドに セカンダリ ソート句を追加 します。
クエリ結果を不変フィールドでソートします。 Atlas Search は、最初のクエリと後続のクエリの間にコレクションに加えた更新を反映します。
updated_timeなどの可変フィールドでソートし、最初と 2 番目のクエリの間にコレクションを更新すると、Atlas Search は同じドキュメントの順序付け方法が異なる場合があります。
不変または一意のフィールドでクエリ結果を並べ替える方法については、「 Atlas Search結果の並べ替え 」を参照してください。
検索ノードを配置した場合は、次の点を考慮してください。
検索ノード間で結果が異なる可能性があるため、
searchScoreで結果を並べ替えないでください。searchScoreを計算するには、ホストはその上に存在するすべてのドキュメントを考慮に入れます。その中には、削除済みのドキュメントでインデックスからはまだ削除されていないものも含まれます。削除は各ホストで個別に発生するため、クエリがどのホストでルーティングされるかに応じてsearchScoreが変動することがあります。
検索ノードで searchScore に基づくソート時にページ分割をサポートするには、MongoDB フィードバックエンジンでこちらのリクエストに投票してください。
参照点の取得
特定の時点でクエリ結果を検索するには、 $searchクエリで参照点を指定する必要があります。 参照点を検索するには、 ステージの後の$meta searchSequenceToken$projectステージで$search キーワード を使用します。
構文
1 [{ 2 "$search": { 3 "index": "<index-name>", 4 "<operator-name>"|"<collector-name>": { 5 <operator-specification>|<collector-specification> 6 } 7 "sort": { 8 "score": { 9 "$meta": "searchScore" 10 } 11 }, 12 ... 13 }, 14 { 15 "$project": { 16 "paginationToken" : { "$meta" : "searchSequenceToken" } 17 }, 18 ... 19 }]
出力
searchSequenceTokenは、結果内の各ドキュメントに対して base 64でエンコードされたトークンを生成します。 トークンの長さは、クエリのソートオプションで指定されたフィールドの数に応じて増加します。 トークンはデータベースのスナップショットには関連付けられていません。
クエリでsortオプションを指定しない限り、結果内のドキュメントはデフォルトの順序でソートされます。 結果の並べ替えの詳細については、「 Atlas Search結果の並べ替え 」を参照してください。
特定の参照点の後の検索
参照点を検索するには、 searchSequenceTokenによって生成されたトークンでsearchAfterオプションを使用して、 $searchクエリで参照点を指定する必要があります。 searchSequenceTokenによって生成されたトークンは、 searchSequenceTokenがトークンを生成した$searchクエリを再実行した場合にのみ使用できます。 トークンを使用する後続の$searchクエリのセマンティクス(検索フィールドと値)は、 searchSequenceTokenがトークンを生成したクエリと同一である必要があります。
searchAfterオプションを使用して、アプリケーション内で「次のページ」機能を構築できます。 これを示すには、このページの例を参照してください。
searchAfter 構文
1 { 2 "$search": { 3 "index": "<index-name>", 4 "<operator-name>"|"<collector-name>": { 5 <operator-specification>|<collector-specification> 6 }, 7 "searchAfter": "<base64-encoded-token>", 8 "sort": { 9 "score": { 10 "$meta": "searchScore" 11 } 12 }, 13 ... 14 }, 15 "$project": { 16 "paginationToken" : { "$meta" : "searchSequenceToken" } 17 }, 18 ... 19 }
出力
Atlas Search では、指定トークンの発行後に結果内のドキュメントが返されます。 Atlas Search では、 $searchステージの後の$projectステージでsearchSequenceTokenを指定したため、結果内のドキュメントの生成されたトークンが返されます( 11行に表示)。 これらのトークンは、同じセマンティクスを持つ別のクエリの参照ポイントとして使用できます。
クエリでsortオプションを指定しない限り、結果内のドキュメントはデフォルトの順序でソートされます。 結果の並べ替えの詳細については、「 Atlas Search結果の並べ替え 」を参照してください。
特定の参照点の前の検索
参照点の前を検索するには、 searchSequenceTokenによって生成されたトークンでsearchBeforeオプションを使用して、 $searchクエリで参照点を指定する必要があります。 searchSequenceTokenによって生成されたトークンは、 searchSequenceTokenがトークンを生成した$searchクエリを再実行した場合にのみ使用できます。 トークンを使用する後続の$searchクエリのセマンティクス(検索フィールドと値)は、 searchSequenceTokenがトークンを生成したクエリと同一である必要があります。
searchBeforeオプションを使用して、アプリケーション内で「前のページ」機能を構築できます。 「前のページ」機能を構築するには、以下を組み合わせます。
これを証明するために、このページのsearchBeforeクエリ例を参照してください。
searchBefore 構文
1 { 2 "$search": { 3 "index": "<index-name>", 4 "<operator-name>"|"<collector-name>": { 5 <operator-specification>|<collector-specification> 6 }, 7 "searchBefore": "<base64-encoded-token>", 8 "sort": { 9 "score": { 10 "$meta": "searchScore" 11 } 12 }, 13 ... 14 }, 15 "$project": { 16 "paginationToken" : { "$meta" : "searchSequenceToken" } 17 }, 18 ... 19 }
searchBefore 出力
Atlas Search では、指定されたトークンに先行する結果内のドキュメントが逆の順序で返されます。 Atlas Search では、searchSequenceToken $project$searchステージの後の ステージで を指定したため、結果内のドキュメントの生成されたトークンも返されます(11 行に表示されているように)。これらのトークンは、同じセマンティクスを持つ別のクエリの参照ポイントとして使用できます。
例
次の例えでは、動的マッピングを持つdefaultという名前の Atlas Search インデックスがあるsample-mflix.moviesコレクションを使用します。 コレクションをロードしてインデックスを作成すると、コレクションに対して次のクエリを実行できます。
このクエリは参照点の検索方法を示しており、指定した参照点の前後で同じ検索期間の追加結果を取得するために、後続のクエリでこの参照点を使用します。
この例は、次のタスクを実行する方法を示します。
注意
デフォルトでは、Atlas Search は結果内のドキュメントを、ドキュメントの関連性スコアでソートします。 結果内の複数のドキュメントのスコアが同じである場合、Atlas Search は任意の順序付けられた結果を返します。 特定の順序でドキュメントを返すには、クエリで一意のフィールドreleasedを指定して結果をソートします。
サンプル クエリでは、次のパイプライン ステージを使用して最初のページの結果を取得し、後続のクエリのトークンまたは参照点を取得します。
結果を | |
ドキュメントの
|
db.movies.aggregate([ { "$search": { "index": "pagination-tutorial", "text": { "path": "title", "query": "summer" }, "sort": { "released": 1 } } }, { "$limit": 10 }, { "$project": { "_id": 0, "title": 1, "released": 1, "genres": 1, "paginationToken" : { "$meta" : "searchSequenceToken" }, "score": { "$meta": "searchScore" } } } ])
[ { genres: [ 'Drama' ], title: "A Summer at Grandpa's", paginationToken: 'CKUdGgJgAA==', score: 2.262615203857422 }, { genres: [ 'Musical', 'Romance' ], title: 'Summer Stock', released: ISODate('1951-01-22T00:00:00.000Z'), paginationToken: 'CJsFGgkpAHw/0HT///8=', score: 3.000213623046875 }, { genres: [ 'Comedy', 'Romance' ], title: 'Smiles of a Summer Night', released: ISODate('1957-12-23T00:00:00.000Z'), paginationToken: 'CKIHGgkpAKDlpaf///8=', score: 2.0149309635162354 }, { genres: [ 'Drama' ], title: 'Violent Summer', released: ISODate('1959-11-13T00:00:00.000Z'), paginationToken: 'CI8JGgkpAJhJh7X///8=', score: 3.000213623046875 }, { genres: [ 'Drama', 'Romance' ], title: 'A Summer Place', released: ISODate('1959-11-18T00:00:00.000Z'), paginationToken: 'CLoJGgkpAGQJobX///8=', score: 2.579726457595825 }, { genres: [ 'Drama' ], title: 'The End of Summer', released: ISODate('1962-02-01T00:00:00.000Z'), paginationToken: 'CK0KGgkpAAzP18X///8=', score: 2.262615203857422 }, { genres: [ 'Drama', 'Romance' ], title: 'Summer and Smoke', released: ISODate('1962-04-01T00:00:00.000Z'), paginationToken: 'CMQKGgkpAECmB8f///8=', score: 2.579726457595825 }, { genres: [ 'Documentary', 'Sport' ], title: 'The Endless Summer', released: ISODate('1968-08-17T00:00:00.000Z'), paginationToken: 'CO4MGgkpAJjH5vX///8=', score: 2.579726457595825 }, { genres: [ 'Comedy', 'Drama', 'Romance' ], title: "Summer of '42", released: ISODate('1971-04-09T00:00:00.000Z'), paginationToken: 'CPQQGgkpAGRgUAkAAAA=', score: 2.579726457595825 }, { genres: [ 'Drama' ], title: 'That Certain Summer', released: ISODate('1972-11-01T00:00:00.000Z'), paginationToken: 'COwRGgkpAPQV0hQAAAA=', score: 2.579726457595825 } ]
追加の結果を検索するには、結果を検索したい時点より後の参照点を指定します。
サンプル クエリでは、次のパイプライン ステージを使用して、同じタームの前のクエリからsearchSequenceTokenによって生成されたトークンを使用して、2 ページの結果を検索します。
| |
結果を | |
ドキュメントの
|
db.movies.aggregate([ { "$search": { "index": "pagination-tutorial", "text": { "path": "title", "query": "summer" }, "searchAfter": "COwRGgkpAPQV0hQAAAA=", "sort": { "released": 1 } } }, { "$limit": 10 }, { "$project": { "_id": 0, "title": 1, "released": 1, "genres": 1, "paginationToken" : { "$meta" : "searchSequenceToken" }, "score": { "$meta": "searchScore" } } } ])
[ { genres: [ 'Drama' ], title: 'Summer Wishes, Winter Dreams', released: ISODate('1974-09-09T00:00:00.000Z'), paginationToken: 'CMwSGgkpAECHcCIAAAA=', score: 2.262615203857422 }, { genres: [ 'Drama', 'Thriller' ], title: 'Shadows of a Hot Summer', released: ISODate('1978-09-01T00:00:00.000Z'), paginationToken: 'CPEVGgkpAGw/qz8AAAA=', score: 2.0149309635162354 }, { genres: [ 'Drama' ], title: 'Indian Summer', released: ISODate('1978-11-01T00:00:00.000Z'), paginationToken: 'CNYRGgkpAFhj5UAAAAA=', score: 3.000213623046875 }, { genres: [ 'Drama' ], title: 'Indian Summer', released: ISODate('1978-11-01T00:00:00.000Z'), paginationToken: 'CNsRGgkpAFhj5UAAAAA=', score: 3.000213623046875 }, { genres: [ 'Drama', 'Mystery' ], title: 'One Deadly Summer', released: ISODate('1983-05-11T00:00:00.000Z'), paginationToken: 'COwcGgkpAAjtIGIAAAA=', score: 2.579726457595825 }, { genres: [ 'Comedy' ], title: 'Summer Rental', released: ISODate('1985-08-09T00:00:00.000Z'), paginationToken: 'CL8fGgkpABTypHIAAAA=', score: 3.000213623046875 }, { genres: [ 'Drama', 'Romance' ], title: 'Summer', released: ISODate('1986-08-29T00:00:00.000Z'), paginationToken: 'CO0gGgkpAHCiY3oAAAA=', score: 3.5844719409942627 }, { genres: [ 'Drama', 'Thriller' ], title: 'Summer Camp Nightmare', released: ISODate('1987-04-17T00:00:00.000Z'), paginationToken: 'CNkiGgkpAHQ/CX8AAAA=', score: 2.579726457595825 }, { genres: [ 'Action', 'Crime', 'Drama' ], title: 'Cold Summer of 1953', released: ISODate('1988-06-01T00:00:00.000Z'), paginationToken: 'CNsjGgkpACjVTYcAAAA=', score: 2.262615203857422 }, { genres: [ 'Drama', 'War' ], title: 'That Summer of White Roses', released: ISODate('1989-07-11T00:00:00.000Z'), paginationToken: 'CI0mGgkpALSEc48AAAA=', score: 2.0149309635162354 } ]
以前の結果を検索するには、結果を検索したい時点より前の参照点を指定します。
このサンプル クエリでは、次のパイプライン ステージを使用して、前のクエリで同じタームのsearchSequenceTokenによって生成されたトークンを使用して、最初のページの 結果を返します。
| |
結果を | |
ドキュメントの
|
注意
デフォルトでは、参照点の前に結果を検索するためのトークンを指定するクエリに対して、Atlas Search は逆の順序で結果を返します。 ドキュメントを順番に返すには、クエリではtoArray()と JavaScript reverse()メソッドが使用されます。
db.movies.aggregate([ { "$search": { "index": "pagination-tutorial", "text": { "path": "title", "query": "summer" }, "searchBefore": "CMwSGgkpAECHcCIAAAA=", "sort": { "released": 1 } } }, { "$limit": 10 }, { "$project": { "_id": 0, "title": 1, "released": 1, "genres": 1, "paginationToken" : { "$meta" : "searchSequenceToken" }, "score": { "$meta": "searchScore" } } } ]).toArray().reverse()
[ { genres: [ 'Drama' ], title: "A Summer at Grandpa's", paginationToken: 'CKUdGgJgAA==', score: 2.262615203857422 }, { genres: [ 'Musical', 'Romance' ], title: 'Summer Stock', released: ISODate('1951-01-22T00:00:00.000Z'), paginationToken: 'CJsFGgkpAHw/0HT///8=', score: 3.000213623046875 }, { genres: [ 'Comedy', 'Romance' ], title: 'Smiles of a Summer Night', released: ISODate('1957-12-23T00:00:00.000Z'), paginationToken: 'CKIHGgkpAKDlpaf///8=', score: 2.0149309635162354 }, { genres: [ 'Drama' ], title: 'Violent Summer', released: ISODate('1959-11-13T00:00:00.000Z'), paginationToken: 'CI8JGgkpAJhJh7X///8=', score: 3.000213623046875 }, { genres: [ 'Drama', 'Romance' ], title: 'A Summer Place', released: ISODate('1959-11-18T00:00:00.000Z'), paginationToken: 'CLoJGgkpAGQJobX///8=', score: 2.579726457595825 }, { genres: [ 'Drama' ], title: 'The End of Summer', released: ISODate('1962-02-01T00:00:00.000Z'), paginationToken: 'CK0KGgkpAAzP18X///8=', score: 2.262615203857422 }, { genres: [ 'Drama', 'Romance' ], title: 'Summer and Smoke', released: ISODate('1962-04-01T00:00:00.000Z'), paginationToken: 'CMQKGgkpAECmB8f///8=', score: 2.579726457595825 }, { genres: [ 'Documentary', 'Sport' ], title: 'The Endless Summer', released: ISODate('1968-08-17T00:00:00.000Z'), paginationToken: 'CO4MGgkpAJjH5vX///8=', score: 2.579726457595825 }, { genres: [ 'Comedy', 'Drama', 'Romance' ], title: "Summer of '42", released: ISODate('1971-04-09T00:00:00.000Z'), paginationToken: 'CPQQGgkpAGRgUAkAAAA=', score: 2.579726457595825 }, { genres: [ 'Drama' ], title: 'That Certain Summer', released: ISODate('1972-11-01T00:00:00.000Z'), paginationToken: 'COwRGgkpAPQV0hQAAAA=', score: 2.579726457595825 } ]
結果をスキップして 2 ページから 5 ページへジャンプするには、searchSequenceToken が生成するトークンを使用して、結果を取得する基準点を指定し、その後、結果で 20 件のドキュメントをスキップします。
サンプル クエリでは、前のクエリで同じタームのsearchSequenceTokenによって生成されたトークンを使用し、 $skip } ステージと$limitステージを使用して、次のパイプライン ステージを使用してページ5の結果に移動します。
| |
指定された参照点の後の結果内の 20 件のドキュメントをスキップします。この参照点は、searchAfter を使用してページ 2 を取得するために実行したクエリの結果内の 20 番目のドキュメントに関連付けられたトークンです。 | |
結果を | |
ドキュメントの
|
db.movies.aggregate([ { "$search": { "index": "pagination-tutorial", "text": { "path": "title", "query": "summer" }, "searchAfter": "COwRGgkpAPQV0hQAAAA=", "sort": { "released": 1 } } }, { "$skip": 20 }, { "$limit": 10 }, { "$project": { "_id": 0, "title": 1, "released": 1, "genres": 1, "paginationToken" : { "$meta" : "searchSequenceToken" }, "score": { "$meta": "searchScore" } } } ])
[ { genres: [ 'Drama' ], title: 'A Storm in Summer', released: ISODate('2000-02-27T00:00:00.000Z'), paginationToken: 'CO5FGgkpAChakN0AAAA=', score: 2.262615203857422 }, { genres: [ 'Comedy', 'Romance' ], title: 'Wet Hot American Summer', released: ISODate('2002-04-11T00:00:00.000Z'), paginationToken: 'CKtIGgkpAFBUIu0AAAA=', score: 2.262615203857422 }, { genres: [ 'Comedy', 'Drama', 'Romance' ], title: 'Summer Things', released: ISODate('2002-10-09T00:00:00.000Z'), paginationToken: 'CIpPGgkpAFxzxvAAAAA=', score: 3.000213623046875 }, { genres: [ 'Adventure', 'Drama', 'Family' ], title: 'Wolf Summer', released: ISODate('2003-02-28T00:00:00.000Z'), paginationToken: 'COZWGgkpAGS6ofMAAAA=', score: 3.000213623046875 }, { genres: [ 'Animation', 'Adventure' ], title: 'Nasu: Summer in Andalusia', released: ISODate('2003-06-26T00:00:00.000Z'), paginationToken: 'CNlaGgkpAMxoAfYAAAA=', score: 2.262615203857422 }, { genres: [ 'Drama' ], title: 'Spring, Summer, Fall, Winter... and Spring', released: ISODate('2004-05-28T00:00:00.000Z'), paginationToken: 'CJ5ZGgkpAOjnyPwAAAA=', score: 1.8161234855651855 }, { genres: [ 'Comedy', 'Drama', 'Romance' ], title: 'Summer Storm', released: ISODate('2004-09-02T00:00:00.000Z'), paginationToken: 'CMVfGgkpAMRwvP4AAAA=', score: 3.000213623046875 }, { genres: [ 'Drama' ], title: 'Summer in the Golden Valley', released: ISODate('2004-10-08T00:00:00.000Z'), paginationToken: 'CNNWGgkpALTVdf8AAAA=', score: 2.0149309635162354 }, { genres: [ 'Drama', 'Romance' ], title: 'My Summer of Love', released: ISODate('2005-07-01T00:00:00.000Z'), paginationToken: 'CL5aGgkpAEyxzwQBAAA=', score: 2.262615203857422 }, { genres: [ 'Drama' ], title: 'Summer in Berlin', released: ISODate('2006-01-05T00:00:00.000Z'), paginationToken: 'CPZmGgkpANzclwgBAAA=', score: 2.579726457595825 } ]
Atlas Search facet Collectorを使用して結果をグループ化するには、任意のstring フィールドをtoken タイプとしてインデックス付けする必要があります。次のクエリを実行し、movies コレクションの genres フィールドで結果をグループ化するには、インデックスを次の例のようにする必要があります。
{ "mappings": { "dynamic": true, "fields": { "genres": { "type": "token" } } } } }
サンプル クエリでは、次のパイプライン ステージを使用します。
| |
searchSequenceTokenオプションを使用して生成された結果内の各ドキュメントのトークンを保存するために | |
結果を | |
次のフィールドを返します。
|
db.movies.aggregate([ { "$search": { "index": "pagination-tutorial", "facet": { "operator": { "text": { "path": "title", "query": "summer" } }, "facets": { "genresFacet": { "type": "string", "path": "genres" } } } } }, { "$addFields": { "paginationToken" : { "$meta" : "searchSequenceToken" } } }, { "$limit": 10 }, { "$facet": { "docs": [ { "$project": { "_id": 0, "title": 1, "released": 1, "genres": 1, "paginationToken" : 1 } } ], "meta": [ { "$replaceWith": "$$SEARCH_META" }, { "$limit": 1 } ] } }, { "$set": { "meta": { "$arrayElemAt": ["$meta", 0] } } } ])
[ { docs: [ { genres: [ 'Drama', 'Romance' ], title: 'Summer', released: ISODate('1986-08-29T00:00:00.000Z'), paginationToken: 'CO0gFf1nZUA=' }, { genres: [ 'Musical', 'Romance' ], title: 'Summer Stock', released: ISODate('1951-01-22T00:00:00.000Z'), paginationToken: 'CJsFFYADQEA=' }, { genres: [ 'Drama' ], title: 'Violent Summer', released: ISODate('1959-11-13T00:00:00.000Z'), paginationToken: 'CI8JFYADQEA=' }, { genres: [ 'Drama' ], title: 'Indian Summer', released: ISODate('1978-11-01T00:00:00.000Z'), paginationToken: 'CNYRFYADQEA=' }, { genres: [ 'Drama' ], title: 'Indian Summer', released: ISODate('1978-11-01T00:00:00.000Z'), paginationToken: 'CNsRFYADQEA=' }, { genres: [ 'Comedy' ], title: 'Summer Rental', released: ISODate('1985-08-09T00:00:00.000Z'), paginationToken: 'CL8fFYADQEA=' }, { genres: [ 'Comedy', 'Drama', 'Romance' ], title: 'Summer Things', released: ISODate('2002-10-09T00:00:00.000Z'), paginationToken: 'CIpPFYADQEA=' }, { genres: [ 'Adventure', 'Drama', 'Family' ], title: 'Wolf Summer', released: ISODate('2003-02-28T00:00:00.000Z'), paginationToken: 'COZWFYADQEA=' }, { genres: [ 'Comedy', 'Drama', 'Romance' ], title: 'Summer Storm', released: ISODate('2004-09-02T00:00:00.000Z'), paginationToken: 'CMVfFYADQEA=' }, { genres: [ 'Drama', 'Romance' ], title: 'Summer Palace', released: ISODate('2007-04-18T00:00:00.000Z'), paginationToken: 'CIRrFYADQEA=' } ], meta: { count: { lowerBound: Long('65') }, facet: { genresFacet: { buckets: [ { _id: 'Drama', count: Long('48') }, { _id: 'Romance', count: Long('20') }, { _id: 'Comedy', count: Long('19') }, { _id: 'Family', count: Long('7') }, { _id: 'Adventure', count: Long('5') }, { _id: 'Crime', count: Long('5') }, { _id: 'Mystery', count: Long('5') }, { _id: 'Thriller', count: Long('5') }, { _id: 'Horror', count: Long('4') }, { _id: 'Action', count: Long('3') } ] } } } } ]