如何在AWS AppSync中通过用户ID数组查询获取用户对象列表
问题原因
- 你自定义的
getAllFriends查询字段没有配置对应的解析器和数据源,AWS AppSync不会自动为自定义Query生成查询逻辑,无解析器的字段默认返回null。 - 过滤操作符使用错误:
contains是字符串匹配操作符,语义为「字段值包含传入的字符串子串」,无法实现「ID值存在于传入数组」的匹配需求,该场景需要使用in操作符。 - 自定义输入类型定义和实际传参不匹配:你定义的
contains字段为数组类型,但查询时传入的是单个字符串,类型校验本身就不通过。
实现方案
方案一:直接使用Amplify自动生成的查询能力
使用@model指令后Amplify会自动生成listUsers查询,原生支持in过滤,不需要额外开发自定义查询,直接使用即可:
query MyQuery { listUsers(filter: {id: {in: ["VALID-USER-ID-1", "VALID-USER-ID-2"]}}) { items { id username } } }
方案二:自定义getAllFriends查询
如果需要保留自定义查询字段,按以下步骤修改:
- 简化schema定义,复用Amplify原生生成的过滤类型和返回类型,不需要自行编写输入参数定义:
type User @model { id: ID! username: String! friends: [String] } type Query { getAllFriends(filter: ModelUserFilterInput): ModelUserConnection }
- 在AWS AppSync控制台为
getAllFriends字段绑定User表对应的DynamoDB数据源,配置解析器:
- 请求映射模板:
{ "version": "2018-05-29", "operation": "Scan", "filter": #if($context.args.filter) $util.transform.toDynamoDBFilterExpression($context.args.filter) #else null #end }
- 响应映射模板:
$util.toJson($context.result)
注意事项
in操作符最多支持同时传入100个ID值,超过该数量需要拆分多次查询- 如果User表数据量较大,全表扫描+过滤的方式会产生额外的成本和延迟,高频查询场景建议搭配二级索引或者使用
@connection指令配置好友关系关联查询。
内容的提问来源于stack exchange,提问作者crayden
相关产品推荐
相关产品推荐

