Docs Menu
Docs Home
/
Atlas
/ / / /

結果のページ分割

MongoDB 6.0.13 + または7.0.5 + を実行している Atlas クラスターでは、 Atlas Search を使用して、 $searchクエリ結果を参照点の後、または前に順番に取得します。 $search searchAfterまたはsearchBeforeオプションを使用して結果を順番に走査し、アプリケーション内に「次のページ」と「前のページ」関数を構築します。

ページ分割された結果を検索するには、次の手順を実行します。

  1. クエリを実行したいフィールドにインデックスを作成します。

  2. 参照点を返す$searchクエリを実行します。 詳しくは、「 参照点を取得する 」を参照してください。

  3. 後続の$searchクエリで参照点を使用して、結果内に次または前のドキュメント セットを検索します。

    • "Next Page" 関数を構築するための結果の検索の詳細については、「特定の参照点の後の検索 」を参照してください。

    • 「前のページ」関数を構築するための結果の検索の詳細については、「特定の参照点の前の検索 」を参照してください。

    • 結果のページに移動するには、 $skip$limit$search searchAfterまたはsearchBeforeオプションと組み合わせて使用します。 たとえば、ページ3からページ5に移動し、1 ページあたり10の結果に移動するには、次の操作を実行します。

      1. ページ3の最後の結果の参照点を持つsearchAfterを使用して結果を取得します(結果30 )。

      2. ページ4の10結果(結果31 - 40 )をスキップするには$skipを使用し、結果を10ドキュメントに制限するには、 $limitを使用します。

      3. ページ5の結果を返します(結果41 - 50 )。

      ここで、$skipsearchAfter オプションとともに使用すると、クエリが最適化され、結果の 1 ページのみをスキップします(10件のドキュメント)。比較すると、$search searchAfter オプションを使用せずに $skip を使用すると、クエリは結果の 4 ページ(40件のドキュメント)をスキップします。詳細については、「searchAfter と $skip を使用してページ 2 からページ 5 へジャンプする」をご覧ください。

複数のドキュメントが同じ値を持つフィールドでソートすると、同順位となります。 MongoDB、関連付けられたクエリ結果の順序が保証されていないため、searchAftersearchBefore を使用すると重複や不整合が発生する可能性があります。 決定的な検索動作を確保するには、次の原則を適用します。

  • 関連性スコアが同値になるのを防ぐために、クエリを一意のフィールドでソートします。

  • 非 一意のフィールドで主にソートする場合は、タイブレークとして機能するために一意のフィールドに セカンダリ ソート句を追加 します。

  • クエリ結果を不変フィールドでソートします。 Atlas Search は、最初のクエリと後続のクエリの間にコレクションに加えた更新を反映します。 updated_time などの可変フィールドでソートし、最初と 2 番目のクエリの間にコレクションを更新すると、Atlas Search は同じドキュメントの順序付け方法が異なる場合があります。

不変または一意のフィールドでクエリ結果を並べ替える方法については、「 Atlas Search結果の並べ替え 」を参照してください。

検索ノードを配置した場合は、次の点を考慮してください。

  • 検索ノード間で結果が異なる可能性があるため、searchScore で結果を並べ替えないでください。

  • searchScore を計算するには、ホストはその上に存在するすべてのドキュメントを考慮に入れます。その中には、削除済みのドキュメントでインデックスからはまだ削除されていないものも含まれます。削除は各ホストで個別に発生するため、クエリがどのホストでルーティングされるかに応じて searchScore が変動することがあります。

検索ノードで searchScore に基づくソート時にページ分割をサポートするには、MongoDB フィードバックエンジンでこちらのリクエストに投票してください。

特定の時点でクエリ結果を検索するには、 $searchクエリで参照点を指定する必要があります。 参照点を検索するには、 ステージの後の$meta searchSequenceToken$projectステージで$search キーワード を使用します。

searchSequenceToken 構文
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", _id:1
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", _id:1
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オプションを使用して、アプリケーション内で「前のページ」機能を構築できます。 「前のページ」機能を構築するには、以下を組み合わせます。

  • $searchオプションを使用した ステージsearchBefore

  • $limit ステージ

  • toArray()メソッドとreverse()メソッド。

これを証明するために、このページの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", _id:1
11 }
12 }
13 ...
14 },
15 "$project": {
16 { "paginationToken" : { "$meta" : "searchSequenceToken" } }
17 },
18 ...
19}

Atlas Search では、指定されたトークンに先行する結果内のドキュメントが逆の順序で返されます。 Atlas Search では、searchSequenceToken $project$searchステージの後の ステージで を指定したため、結果内のドキュメントの生成されたトークンも返されます(11 行に表示されているように)。これらのトークンは、同じセマンティクスを持つ別のクエリの参照ポイントとして使用できます。

次の例えでは、動的マッピングを持つdefaultという名前の Atlas Search インデックスがあるsample-mflix.moviesコレクションを使用します。 コレクションをロードしてインデックスを作成すると、コレクションに対して次のクエリを実行できます。

このクエリは参照点の検索方法を示しており、指定した参照点の前後で同じ検索期間の追加結果を取得するために、後続のクエリでこの参照点を使用します。

この例は、次のタスクを実行する方法を示します。

  1. ページ1の取得とページ分割トークンの生成

  2. searchAfter を使用してページ 2 を取得する

  3. searchBefore を使用してページ 1 に戻る

  4. searchAfter と $skip を使用してページ 2 からページ 5 へジャンプする

  5. ページに分けた結果でファセットを使用する

注意

デフォルトでは、Atlas Search は結果内のドキュメントを、ドキュメントの関連性スコアでソートします。 結果内の複数のドキュメントのスコアが同じである場合、Atlas Search は任意の順序付けられた結果を返します。 特定の順序でドキュメントを返すには、クエリで一意のフィールドreleasedを指定して結果をソートします。

戻る

count