如何对查询结果进行分页
在此页面上
本教程演示如何对 Atlas Search 查询的结果进行分页,以在应用程序中构建“下一页”和“上一页”等功能。它还演示了如何使用 $skip
和$limit
跨页跳转。本教程将指导您完成以下步骤:
为
sample_mflix.movies
集合设置具有静态映射的 Atlas Search 索引。针对索引字段运行 Atlas Search 查询以返回连续结果,从而允许您执行以下操作:
按顺序遍历页面以构建“下一页”和“上一页”等函数。
从第二页跳转到第五页,并跳过结果中的页面。
检索结果中每种类型的电影总数。
开始之前,请确保您的 Atlas 集群满足先决条件中描述的要求。
注意
要使用 Atlas Search $search
searchSequenceToken
检索连续结果,您的 Atlas 集群必须运行 MongoDB v 6 。 0 。 13 + 或 v 7 。 0 。 5 +。
使用静态映射创建 Atlas Search 索引
在本部分中,您将创建一个 Atlas Search 索引,该索引使用静态映射对sample_mflix.movies
集合中的字段进行索引。
所需角色
要创建 Atlas Search 索引,您必须拥有 Project Data Access Admin
或更高的项目访问权限。
步骤
定义 Atlas Search 索引。
以下索引定义为以下字段配置索引:
title
字段作为字符串类型,以便针对该字段进行全文搜索genres
字段作为stringFacet类型,用于针对该字段的分面搜索released
字段作为日期类型,用于使用该字段对结果进行排序
您可以使用 Atlas 用户界面中的 Atlas Search Visual Editor 或 Atlas Search JSON Editor 来创建索引。
单击 Next(连接)。
单击 Refine Your Index(连接)。
在 Index Configurations 部分中,切换以禁用 Dynamic Mapping 。
单击 部分中的Add Field Field MappingsAdd,在 窗口中逐项配置以下字段的设置后,单击 。Add Field Mapping
字段名称数据类型配置title
Stringgenres
stringFacetreleased
Date单击 Save Changes(连接)。
将默认索引定义替换为以下定义。
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 } 单击 Next(连接)。
运行查询并对结果进行分页
在本部分中,您将运行查询来检索标题中包含summer
一词的电影的结果。在查询中,您检索一个参考点,然后在后续查询中使用该参考点来检索指定参考点之前和之后同一术语的其他结果。
注意
默认情况下,Atlas Search 按文档的相关性分数对结果中的文档进行排序。如果结果中的多个文档具有相同分数,Atlas Search 将返回任意排序的结果。要按确定的顺序返回文档,查询会指定唯一字段released
来对结果进行排序。
本部分演示如何执行以下操作:
步骤
要运行这些查询,必须首先执行以下操作:
连接到mongosh
中的集群。
在终端窗口中打开mongosh
并连接到集群。有关连接的详细说明,请参阅通过 mongosh 连接。
检索页面1并生成分页令牌
示例查询使用以下管道阶段来检索第一页的结果,并检索后续查询的词元或引用点:
将结果限制为 10 文档。 | |
仅包括结果中文档的
|
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" } } } ])
使用2检索页面 searchAfter
要检索其他结果,请指定要检索结果的参考点。此查询演示了如何检索结果以在应用程序中构建“下一页”等函数。
样本查询使用以下管道阶段检索第二个页面的结果,该页面使用由searchSequenceToken
在同一词的先前查询中生成的令牌:
| |
将结果限制为 10 文档。 | |
仅包括结果中文档的
|
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" } } } ])
返回到页面1使用 searchBefore
要检索以前的结果,请指定要检索之前结果的参考点。此查询演示了如何检索结果以在应用程序中构建“上一页”等函数。
示例查询使用以下管道阶段,使用searchSequenceToken
在同一词语的先前查询中生成的词元返回第一页上的结果:
| |
将结果限制为 10 文档。 | |
仅包括结果中文档的
|
注意
默认情况下,对于指定标记以检索参考点之前结果的查询,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 searchAfter
和 从第 页跳转到第 页$skip
要跳过结果并从页2跳转到5 ,您可以使用searchSequenceToken
生成的令牌来指定引用点,在该引用点之后您要检索结果,然后跳过结果中的 20 个文档。此查询演示了如何检索结果以在应用程序中构建允许跳过页面的函数。
样本查询使用以下管道阶段跳转到第5页上的结果,方法是使用searchSequenceToken
从同一词语的先前查询中生成的令牌,并使用$skip
和$limit
阶段:
| |
跳过结果中指定引用点之后的20个文档,该引用点是与您运行使用 searchAfter 检索页面2的查询的结果中的第二十个文档关联的词元。 | |
将结果限制为 10 文档。 | |
仅包括结果中文档的
|
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 分面结合使用。
示例查询使用以下管道阶段:
| |
添加 paginationToken 字段,以存储使用searchSequenceToken选项生成的结果中每个文档的令牌。 | |
将结果限制为 10 文档。 | |
返回以下字段:
|
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] } } } ])