“文档” 菜单
文档首页
/
MongoDB 阿特拉斯
/ / /

如何对查询结果进行分页

在此页面上

  • 使用静态映射创建 Atlas Search 索引
  • 所需角色
  • 步骤
  • 运行查询并对结果进行分页
  • 步骤
  • 检索页面1并生成分页令牌
  • 使用2检索页面 searchAfter
  • 返回到页面1使用 searchBefore
  • 使用searchAfter$skip从第2页跳转到第5页
  • 对分页结果使用分面

本教程演示如何对 Atlas Search 查询的结果进行分页,以在应用程序中构建“下一页”和“上一页”等功能。它还演示了如何使用 $skip$limit跨页跳转。本教程将指导您完成以下步骤:

  1. sample_mflix.movies集合设置具有静态映射的 Atlas Search 索引。

  2. 针对索引字段运行 Atlas Search 查询以返回连续结果,从而允许您执行以下操作:

    • 按顺序遍历页面以构建“下一页”和“上一页”等函数。

    • 从第二页跳转到第五页,并跳过结果中的页面。

    • 检索结果中每种类型的电影总数。

开始之前,请确保您的 Atlas 集群满足先决条件中描述的要求。

注意

要使用 Atlas Search $search searchSequenceToken检索连续结果,您的 Atlas 集群必须运行 MongoDB v 6 。 0 。 13 + 或 v 7 。 0 。 5 +。

在本部分中,您将创建一个 Atlas Search 索引,该索引使用静态映射sample_mflix.movies集合中的字段进行索引。

要创建 Atlas Search 索引,您必须拥有 Project Data Access Admin 或更高的项目访问权限。

1
  1. 如果尚未显示,请选择包含所需项目的组织导航栏中的Organizations菜单。

  2. 如果尚未显示,请从导航栏的Projects菜单中选择所需的项目。

  3. 如果 Clusters(数据库部署)页面尚未出现,请单击侧边栏中的 Database(数据库)。

2

您可以从侧边栏、 Data Explorer或集群详细信息页面转到 Atlas Search 页面。

  1. 在侧边栏中,单击Services标题下的Atlas Search

  2. Select data source下拉列表中,选择您的集群并单击Go to Atlas Search

  1. 单击集群的对应 Browse Collections 按钮。

  2. 展开数据库并选择集合。

  3. 单击集合的Search Indexes标签页。

  1. 单击集群名称。

  2. 单击 Atlas Search 标签页。

3
4
  • 要获得引导式体验,请选择 Atlas Search Visual Editor

  • 要编辑原始索引定义,请选择 Atlas SearchJSON Editor

5
  1. Index Name 字段中输入 pagination-tutorial

  2. Database and Collection(数据库和集合)部分中找到 sample_mflix 数据库,然后选择 movies 集合。

6

以下索引定义为以下字段配置索引:

  • title 字段作为字符串类型,以便针对该字段进行全文搜索

  • genres 字段作为stringFacet类型,用于针对该字段的分面搜索

  • released 字段作为日期类型,用于使用该字段对结果进行排序

您可以使用 Atlas 用户界面中的 Atlas Search Visual Editor 或 Atlas Search JSON Editor 来创建索引。

  1. 单击 Next(连接)。

  2. 单击 Refine Your Index(连接)。

  3. Index Configurations 部分中,切换以禁用 Dynamic Mapping

  4. 单击 部分中的Add Field Field MappingsAdd,在 窗口中逐项配置以下字段的设置后,单击 。Add Field Mapping

    字段名称
    数据类型配置
    title
    String
    genres
    stringFacet
    released
    Date
  5. 单击 Save Changes(连接)。

  1. 将默认索引定义替换为以下定义。

    1{
    2 "mappings": {
    3 "dynamic": false,
    4 "fields": {
    5 "title": {
    6 "type": "string"
    7 },
    8 "genres": {
    9 "type": "stringFacet"
    10 },
    11 "released": {
    12 "type": "date"
    13 }
    14 }
    15 }
    16}
  2. 单击 Next(连接)。

7

此时将显示一个模态窗口,让您知道索引正在构建中。

8

构建索引大约需要一分钟时间。在构建时,Status 列显示 Initial Sync。构建完成后,Status 列显示 Active

在本部分中,您将运行查询来检索标题中包含summer一词的电影的结果。在查询中,您检索一个参考点,然后在后续查询中使用该参考点来检索指定参考点之前和之后同一术语的其他结果。

注意

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

本部分演示如何执行以下操作:

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

  2. 使用2检索页面 searchAfter

  3. 返回到页面1使用 searchBefore

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

  5. 对分页结果使用分面

要运行这些查询,必须首先执行以下操作:

1

在终端窗口中打开mongosh并连接到集群。有关连接的详细说明,请参阅通过 mongosh 连接。

2
use sample_mflix
switched to db sample_mflix
3

示例查询使用以下管道阶段来检索第一页的结果,并检索后续查询的词元或引用点:

  • 使用文本操作符搜索在title字段中包含summer的标题。

  • 使用排序选项,按released字段值的升序对结果进行排序。

将结果限制为10文档。

仅包括结果中文档的titlereleasedgenres字段。该查询还会将以下字段添加到结果中的每个文档:

  • paginationToken,这是可在后续查询中用作参考点的词元

  • score,这是文档在结果中的相关性得分

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" }
}
}
])

要检索其他结果,请指定要检索结果的参考点。此查询演示了如何检索结果以在应用程序中构建“下一页”等函数。

样本查询使用以下管道阶段检索第二个页面的结果,该页面使用由searchSequenceToken在同一词的先前查询中生成的令牌:

将结果限制为10文档。

仅包括结果中文档的titlereleasedgenres字段。它还将以下字段添加到结果中的每个文档:

  • paginationToken,这是可在后续查询中用作参考点的词元

  • score,这是文档在结果中的相关性得分

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" }
}
}
])

要检索以前的结果,请指定要检索之前结果的参考点。此查询演示了如何检索结果以在应用程序中构建“上一页”等函数。

示例查询使用以下管道阶段,使用searchSequenceToken在同一词语的先前查询中生成的词元返回第一页上的结果:

  • 使用文本操作符搜索在title字段中包含summer的标题。

  • 使用排序选项,按released字段值的升序对结果进行排序。

  • 使用与您运行到使用searchAfter检索页面2的查询结果中的第十一个文档关联的分页令牌,在 Atlas Search 结果中返回文档1到10。

将结果限制为10文档。

仅包括结果中文档的titlereleasedgenres字段。它还将以下字段添加到结果中的每个文档:

  • paginationToken,这是可在后续查询中用作参考点的词元

  • score,这是文档在结果中的相关性得分

注意

默认情况下,对于指定标记以检索参考点之前结果的查询,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()

要跳过结果并从页2跳转到5 ,您可以使用searchSequenceToken生成的令牌来指定引用点,在该引用点之后您要检索结果,然后跳过结果中的 20 个文档。此查询演示了如何检索结果以在应用程序中构建允许跳过页面的函数。

样本查询使用以下管道阶段跳转到第5页上的结果,方法是使用searchSequenceToken从同一词语的先前查询中生成的令牌,并使用$skip$limit阶段:

跳过结果中指定引用点之后的20个文档,该引用点是与您运行使用searchAfter检索页面2的查询的结果中的第二十个文档关联的词元。
将结果限制为10文档。

仅包括结果中文档的titlereleasedgenres字段。它还将以下字段添加到结果中的每个文档:

  • paginationToken,这是可在后续查询中用作参考点的词元

  • score,这是文档在结果中的相关性得分

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" }
}
}
])

本部分演示如何将searchSequenceToken与 Atlas Search 分面结合使用。

示例查询使用以下管道阶段:

  • 使用分收集器搜索在title字段中包含summer的标题。

  • 使用facets选项检索每种类型结果中的电影总数。

添加paginationToken字段,以存储使用searchSequenceToken选项生成的结果中每个文档的令牌。
将结果限制为10文档。

返回以下字段:

  • docs 字段,其中仅包含结果中文档的titlereleasedgenres字段以及paginationToken字段。

  • meta 字段,其中包含存储在$$SEARCH_META变量中的每种类型结果中的电影总数。

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]
}
}
}
])

后退

对结果进行分页

来年

所有结果