Docs 菜单
Docs 主页
/
Atlas
/ / / /

对结果进行分页

在运行 MongoDB 6.0.13 + 或7.0.5 + 的Atlas 集群上,使用 Atlas Search 在参考点之后或之前按顺序检索 $search 查询结果。您可以使用 $search searchAftersearchBefore 选项按顺序遍历结果,并在应用程序中构建“下一页”和“上一页”功能。

要检索分页结果,请执行以下步骤:

  1. 在要查询的字段上创建索引

  2. 运行 $search 查询,返回一个参考点。要了解更多信息,请参阅 检索参考点。

  3. 在随后的 $search 查询中使用参考点来检索结果中的下一组或上一组文档。

    • 要了解有关检索结果以构建“下一页”函数的更多信息,请参阅特定参考点后的Atlas Search 。

    • 要了解有关检索结果以构建“上一页”函数的更多信息,请参阅特定参考点之前的Atlas Search 。

    • 要跳转到结果中的某个页面,请将 $skip$limit$search searchAftersearchBefore 选项相结合。例如,要从第 3 页跳转到第 5 页的结果,每页 10 个结果,请执行以下操作:

      1. 使用searchAfter和第3页上最后一个结果的引用点(结果30 )来检索结果。

      2. 使用$skip跳过第4页上的10结果(结果31 - 40 ),并使用$limit将结果限制为10文档。

      3. 返回第 5 页的结果(结果 41-50)。

      此处,使用 $skipsearchAfter 选项可优化查询,仅跳过 1 页结果(10 文档)。相比之下,如果使用不带 $search searchAfter 选项的 $skip,查询将跳过 4 页的结果(40 文档)。要学习;了解详情,请参阅 使用 searchAfter 和 $skip 从第 2 页跳转到第 5 页。

当您对多个文档具有相同值的字段进行排序时,会出现并列。 MongoDB不保证绑定查询结果的排序,这可能会导致在您使用 searchAftersearchBefore 时出现重复和不一致。 应用以下原则确保确定性的搜索行为:

  • 按唯一字段对查询进行排序,防止相关性得分并列。

  • 如果要主要按非唯一字段进行排序,请在唯一字段上添加从节点(secondary node from replica set)排序子句以提供服务决胜局。

  • 按不可变字段对查询结果进行排序。 Atlas Search反映您在初始查询和后续查询之间对集合所做的更新。 如果您按可变字段(例如 updated_time)排序,并在第一次和第二次查询之间更新集合,则Atlas Search可能会对相同的文档进行不同的排序。

要了解如何按不可变或唯一字段对查询结果进行排序,请参阅对 Atlas Search 结果进行排序

如果部署了搜索节点,请考虑以下事项:

  • 避免按 searchScore 对结果进行排序,因为它可能因搜索节点而异。

  • 为了计算 searchScore,托管会考虑其上存在的所有文档,包括尚未从索引中删除的已删除文档。由于删除操作是在每个托管上独立进行的,因此这可能会导致 searchScore 发生变化,具体取决于查询路由到哪个托管。

要在搜索节点上按 searchScore 排序时支持分页,请在MongoDB反馈引擎中对此请求投赞成票。

要检索某个点的查询结果,必须在 $search 查询中提供参考点。您可以在 $search 阶段之后的 $project 阶段中使用 $meta 关键字 searchSequenceToken 来检索参考点。

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为结果中的每个文档生成一个基本64编码的词元。 令牌的长度随着查询的排序选项中指定的字段数量的增加而增加。 令牌不与数据库快照绑定。

除非在查询中指定 sort 选项,否则结果中的文档将按默认顺序排序。要了解如何对结果进行排序,请参阅对 Atlas Search 结果进行排序。

要在参考点之后搜索,您必须在 $search 查询中通过使用 searchAfter 选项和由 searchSequenceToken 生成的词元来指定参考点。仅当您重新运行由 searchSequenceToken 生成词元的 $search 查询时,才可以使用由 searchSequenceToken 生成的词元。使用词元的后续 $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 SearchsearchSequenceToken $project$search11在结果中返回为文档生成的词元,因为您在 阶段之后的 阶段中指定了 (如第 行所示)。这些词元可用作具有相同语义的另一个查询的参考点。

除非在查询中指定 sort 选项,否则结果中的文档将按默认顺序排序。要了解如何对结果进行排序,请参阅对 Atlas Search 结果进行排序。

要在参考点之前Atlas Search ,您必须使用 searchBefore 选项和 searchSequenceToken 生成的词元在$search查询中指定参考点。 仅当您重新运行 searchSequenceToken 为其生成令牌的$search查询时,才能使用searchSequenceToken 生成的令牌。 使用该令牌的后续$search 查询的语义(Atlas 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", _id:1
11 }
12 }
13 ...
14 },
15 "$project": {
16 { "paginationToken" : { "$meta" : "searchSequenceToken" } }
17 },
18 ...
19}

Atlas Search 以相反的顺序返回结果中指定标记之前的文档。Atlas Search 还会返回结果中文档的生成标记,因为您在 $search 阶段之后的 $project 阶段中指定了 searchSequenceToken(如 11 行所示)。这些标记可以用作具有相同语义的另一个查询的参考点。

以下示例使用 sample-mflix.movies 集合,该集合具有名为 default 的带有动态映射的 Atlas Search 索引。如果加载集合并创建索引,则可以对该集合运行以下查询。

这些查询演示了如何检索参考点,然后在后续查询中使用该参考点来检索指定参考点之前和之后同一术语的其他结果。

此示例演示如何执行以下任务:

  1. 检索第 1 页并生成分页令牌

  2. 使用 searchAfter 检索 2 页

  3. 使用 searchBefore 返回 1 页

  4. 使用 searchAfter 和 $skip 从第 2 页跳转到第 5 页

  5. 在分页结果中使用分面

注意

默认情况下,Atlas Search 根据文档的相关性分数对结果中的文档进行排序。如果结果中的多个文档具有相同的分数,则 Atlas Search 将返回任意排序的结果。要按确定的顺序返回文档,查询会指定一个唯一字段 released,以对结果进行排序。

后退

数数

在此页面上