AWS Amplify查询AlbumCategory未按sortOrder正确排序求助
你的AlbumCategory排序不生效有两个核心原因:
- 自定义@key配置逻辑错误
DynamoDB的排序规则是仅同一哈希键分区内的数据会按排序键有序排列。你当前配置的@key(name: "byID", fields: ["id", "sortOrder"])用id作为哈希键,而每条AlbumCategory的id都是全局唯一值,意味着每个哈希分区仅存在1条数据,排序键sortOrder完全没有发挥作用。 - 调用了错误的查询接口
Amplify默认生成的listAlbumCategorys接口走的是数据表的默认主键索引,不会自动使用你自定义的二级索引,自然不会遵循你定义的sortOrder排序规则。
你提到Album、Song的排序符合预期,本质是这两个模型的自定义@key是给关联查询用的:比如查某个分类下的专辑时,走的是byAlbumCategory索引,同个albumCategoryID分区下的专辑按id排序,和全局list数据的场景完全不同。
1. 调整AlbumCategory的Schema配置
要实现全量专辑分类按sortOrder排序,需要配置一个所有分类数据共享同一哈希键的二级索引,修改代码如下:
type AlbumCategory @model @key(name: "bySortOrder", fields: ["categoryType", "sortOrder"]) { id: ID! categoryType: String! # 新增固定值字段作为索引哈希键 title: String! sortOrder: Int! albums: [Album] @connection(keyName: "byAlbumCategory", fields: ["id"]) }
配置说明:所有AlbumCategory记录的categoryType字段统一存入固定值(比如"album_category"),即可让全部分类数据落到同一个哈希分区,自动按sortOrder字段排序。
2. 部署更新Schema
在项目根目录执行amplify push,等待云端部署完成后,Amplify会自动生成对应二级索引的查询方法listAlbumCategorysBySortOrder。
3. 替换前端查询逻辑
放弃使用默认的listAlbumCategorys接口,改用新生成的按排序索引查询的接口,查询语句参考:
export const listAlbumCategorysBySortOrder = /* GraphQL */ ` query ListAlbumCategorysBySortOrder( $categoryType: String! $sortDirection: ModelSortDirection $filter: ModelAlbumCategoryFilterInput $limit: Int $nextToken: String ) { listAlbumCategorysBySortOrder( categoryType: $categoryType sortDirection: $sortDirection filter: $filter limit: $limit nextToken: $nextToken ) { items { id title albums { nextToken items { id imageUri name by artistsHeadline } } createdAt updatedAt } nextToken } } `;
调用接口时传参categoryType: "album_category"即可拿到按sortOrder升序排列的分类列表,需要倒序展示时额外传sortDirection: "DESC"即可。
存量数据处理
已经存入数据库的老AlbumCategory记录,需要批量补填categoryType字段的固定值,否则无法通过新索引查询到。
轻量替代方案
如果你的专辑分类总数据量很小(少于100条),也可以在前端拿到listAlbumCategorys返回结果后,手动调用数组sort方法按sortOrder字段排序,不需要修改Schema。但数据量较大时不推荐该方案,会出现分页排序错乱、前端计算开销高的问题。
内容的提问来源于stack exchange,提问作者swsoft

