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,它们是给定categoryarea的一部分,由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 和作为排序键的 areapublishOn 组成。

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 属性完成,该属性可以是DESCASC,并且只能在排序键上完成。

@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 调用

AWS Amplify AppSync 使用在 Cognito 中创建的 Google 用户登录

Amplify + AppSync 不改变对象