Amplify AppSync:使用分页进行自定义排序和过滤
Posted
技术标签:
【中文标题】Amplify AppSync:使用分页进行自定义排序和过滤【英文标题】:Amplify AppSync: custom sorting and filtering with pagination 【发布时间】:2021-09-08 18:45:30 【问题描述】:我正在尝试编写一个架构,以便我可以查询由多个键过滤、按自定义键排序和分页的模型。
我的模型示例:
type Article
id: ID!
category: String!
area: String!
publishOn: AWSDate!
我想做的查询的一个例子是:检索所有Articles
,它们是给定category
和area
的一部分,由publishOn
在10个项目的块中按降序返回每个(实现分页服务器端,并有一个轻量级的用户界面)。
响应还应包含nextToken
属性,该属性可用于加载过滤后的文章列表的“下一页”。
我在使用自动生成的架构时遇到了多个问题,并且找不到手动实施适用于所有我想做的解决方案的方法。我试着列出问题所在:
-
过滤
假设我要查询属于“假日”类别的 10 篇文章:
listArticles(filter: category: eq: "Holiday , limit: 10)
我不会获得与该类别匹配的前 10 篇文章,但 AppSync 似乎选择了表中的前 10 个项目,然后它按过滤条件过滤了这 10 个项目。 换句话说,过滤和排序的应用顺序似乎与预期相反。预期:先按过滤条件过滤表,然后返回过滤结果集的前10项。
-
排序
我找不到使用 AppSync 添加排序的方法,所以我添加了可搜索:
type Article (
@searchable
)
id: ID!
category: String!
area: String!
publishOn: AWSDate!
现在,如果我按日期排序,该键将用作 nextToken 并停止分页。这是一个已知问题:https://github.com/aws-amplify/amplify-cli/issues/4434
对于如何找到这些错误的解决方法,您有什么好的建议吗?我深入研究文档和几个问题,但没有想出一个行之有效的解决方案......
提前致谢,
马特奥
【问题讨论】:
【参考方案1】:-
过滤
您需要在 DynamoDB 中使用 Global Secondary Index 才能实现这种行为。您可以使用 @key 注释创建它们。在您的情况下,我将创建一个复合键,该组合键由分区键的 category 和作为排序键的 area 和 publishOn 组成。
type Article
@model
@key(fields: ["id"])
@key(name: "byCategory", fields: ["category", "publishOn"])
@key(name: "byCategoryArea", fields: ["category", "area", "publishOn"])
id: ID!
category: String!
area: String!
publishOn: AWSDate!
-
排序
排序由sortDirection
属性完成,该属性可以是DESC
或ASC
,并且只能在排序键上完成。
@searchable
指令在表上启用弹性搜索,这是一个全文搜索引擎,对于小型应用程序可能有点贵,除非你想基于例如查询,否则这里不需要。文章描述文本。
listArticles(filter: category: eq: "Holiday" , limit: 10, sortDirection: DESC)
【讨论】:
谢谢,这正是我需要的:) 嘿@Lorenz,再次感谢您的帮助。然而,我的一个问题仍未解决。例如,在您编写的示例查询中,如果前 10 篇文章都没有“假期”作为类别,我将获得 0 条记录。我不确定我是否完全理解此处使用 2 个排序键:@key(name: "byCategoryArea", fields: ["category", "area", "publishOn"])
。你能详细谈谈?使用 2 个排序键会解决我的问题吗?谢谢!以上是关于Amplify AppSync:使用分页进行自定义排序和过滤的主要内容,如果未能解决你的问题,请参考以下文章
AppSync/Amplify - 如何定义 GraphQL 订阅
AWS Amplify (AppSync + Cognito) 使用每个组织/租户的动态组进行授权
如何删除并重新创建由 mock api 创建的本地 dynamodb/appsync/amplify 数据库?
通过身份池联合的开发人员身份验证身份无法在 Amplify 项目中进行 AppSync 调用