Docs 菜单
Docs 主页
/ /

对结果进行分页

在运行MongoDB 7.0.5+ 的集群上,使用MongoDB 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 个文档)。相比之下,如果使用 $skip 而不使用 $search searchAfter 选项,查询将跳过 4 页结果( 40 个文档)。要了解更多信息,请参阅使用 searchAfter 和 $skip 从第 2 页跳转到第 5 页。

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

在查询之间更新或删除文档可能会导致结果顺序不一致。应用以下原则来支持确定性搜索行为:

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

  • 如果您部署了专用搜索节点并且按 searchScore对结果进行排序,请考虑以下事项:

    • 默认下, MongoDB搜索使用bm25 相似度算法对文档进行评分,该算法可计算与MongoDB搜索节点上整个文档语料库相关的术语频率。由于每个MongoDB搜索节点都独立从变更流复制,因此该语料库可能因MongoDB搜索节点而异。因此,同一查询在路由到不同的MongoDB搜索节点时,可能会返回不同的bm25 分数。如果您的部署使用专用的MongoDB搜索节点,或者您的读取偏好(read preference)设立为 secondary或 ,则后续查询更有可能路由到不同的MongoDB搜索节点。nearest

    • 为了确保后续查询的分数一致,当您将字段索引为MongoDB搜索字符串或自动完成类型时,请将 similarity.type属性设立为stableTfl boolean或 。这会强制 text、phrase、queryString autocomplete 操作符使用stableTflboolean 相似度算法来计算索引字段查询的相关性分数。这些算法在所有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"
10 }
11 },
12 ...
13 },
14 {
15 "$project": {
16 "paginationToken" : { "$meta" : "searchSequenceToken" }
17 },
18 ...
19}]

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

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

要在参考点之后搜索,您必须在 $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"
11 }
12 },
13 ...
14 },
15 "$project": {
16 "paginationToken" : { "$meta" : "searchSequenceToken" }
17 },
18 ...
19}

MongoDB Search 返回结果中指定词元之后的文档。MongoDB Search 在结果中返回为文档生成的词元,因为您在searchSequenceToken $project$search阶段之后的 阶段中指定了 (如第11 行所示)。这些词元可用作具有相同语义的另一个查询的参考点。

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

要在参考点之前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"
11 }
12 },
13 ...
14 },
15 "$project": {
16 "paginationToken" : { "$meta" : "searchSequenceToken" }
17 },
18 ...
19}

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

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

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

这些示例演示了如何执行以下任务:

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

  2. 使用 searchAfter 检索第 2 页

  3. 使用 searchBefore 返回第 1 页

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

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

注意

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

后退

数数

在此页面上