AWS Amplify GraphQL二级索引:按updatedAt排序并筛选candidateStatus
解决AppSync二级索引按updatedAt排序并筛选特定candidateStatus的问题
需求场景
需要创建GraphQL二级索引,实现查询特定候选人下所有candidateStatus为"Applied"的申请,并按updatedAt字段排序。同时要求分页查询时(每页15条),不会遗漏符合条件的记录。
现有实现问题
当前使用的模型定义如下:
type Application @model @auth(...) { id: ID! updatedAt: AWSDateTime candidateStatus: String candidateID: ID @index( name: "byCandidateApplications" queryField: "byCandidateApplications" sortKeyFields: ["updatedAt", "candidateStatus"] ) }
测试查询时遇到强制要求指定updatedAt的错误:
query MyQuery { byCandidateApplications( candidateID: "xxxxxxxxxxx", updatedAtCandidateStatus: { eq: {candidateStatus: "Applied" } }, sortDirection: ASC) { nextToken items { updatedAt } } }
错误信息:
"message": "When providing argument 'updatedAtCandidateStatus.$operation.candidateStatus' you must also provide 'updatedAtCandidateStatus.$operation.updatedAt'."
同时无法使用过滤器解决:因为过滤器是在返回15条数据后才生效,会导致第16条及以后符合条件的记录被遗漏,无法获取所有目标数据。
解决方案
调整二级索引的排序键顺序,将candidateStatus放在updatedAt之前,让索引先按状态分组,再按更新时间排序。
修改后的模型定义
type Application @model @auth(...) { id: ID! updatedAt: AWSDateTime candidateStatus: String candidateID: ID @index( name: "byCandidateStatusAndUpdatedAt" queryField: "byCandidateStatusAndUpdatedAt" sortKeyFields: ["candidateStatus", "updatedAt"] ) }
对应的查询语句
query GetAppliedApplications { byCandidateStatusAndUpdatedAt( candidateID: "xxxxxxxxxxx", candidateStatusUpdatedAt: { eq: {candidateStatus: "Applied" } }, sortDirection: ASC, limit: 15 ) { nextToken items { id candidateStatus updatedAt candidateID } } }
原理说明
- 调整后的索引以
candidateID为分区键,candidateStatus + updatedAt为复合排序键,查询时可以单独指定candidateStatus的匹配条件,无需强制提供updatedAt的值。 - 分页时会先筛选出该候选人下所有
candidateStatus为"Applied"的记录,再按updatedAt排序并返回前15条,后续通过nextToken可以获取剩余符合条件的记录,不会出现遗漏问题。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

