如何在AWS AppSync中筛选Sort Key匹配字符串数组的GraphQL结果?
解决DynamoDB + AppSync中查询排序键匹配数组值的问题
我明白你现在的困境——想查询根记录中排序键匹配数组任一值的条目,但之前用contains的方法都失败了。这是因为DynamoDB对主键(包括排序键)的筛选规则和普通属性不一样,下面给你两个可行的解决方案:
方案1:用Query操作配合Key Condition Expression(推荐)
因为你的根记录都有固定的分区键root,完全可以利用DynamoDB的Query操作,在Key Condition Expression里直接指定分区键,并对排序键使用IN操作符来匹配数组中的值。这是效率最高的方式,因为Query是直接基于主键索引检索,不会全表扫描。
AppSync Resolver示例(VTL模板)
请求模板(Request Mapping Template)
{ "version": "2017-02-28", "operation": "Query", "query": { "expression": "PK = :pk AND SK IN (:skValues)", "expressionValues": { ":pk": {"S": "root"}, ":skValues": { "L": #foreach($sk in $ctx.args.skArray) {"S": "$sk"}#if($foreach.hasNext),#end#end } } } }
这里$ctx.args.skArray就是你传入的字符串数组(比如["id0001", "id0002"]),模板会把它转换成DynamoDB需要的列表格式。
响应模板(Response Mapping Template)
$util.toJson($ctx.result.items)
为什么这个可行?
IN操作符在Key Condition Expression中支持排序键的多值匹配,前提是你已经指定了固定的分区键- 这种方式直接利用主键索引,性能远优于扫描或过滤器筛选
方案2:用Batch Get Item操作
如果你的数组长度不大(最多100项),也可以用BatchGetItem来批量获取每个(PK=root, SK=xxx)的条目。这种方式适合需要精确匹配多个主键对的场景。
AppSync Resolver示例(VTL模板)
请求模板
{ "version": "2017-02-28", "operation": "BatchGetItem", "tables": { "你的表名": { "keys": #foreach($sk in $ctx.args.skArray) {"PK": {"S": "root"}, "SK": {"S": "$sk"}}#if($foreach.hasNext),#end#end } } }
响应模板
#set($results = []) #foreach($item in $ctx.result.data.你的表名) $util.addToArray($results, $item) #end $util.toJson($results)
注意事项
- 不管用哪种方式,DynamoDB都有单次请求的条目限制(最多100项),如果你的数组长度超过100,需要在客户端或Resolver中分批处理
- 避免使用
Scan操作配合过滤器,因为Scan会全表遍历,性能极差,尤其是数据量较大时 - 之前的
contains报错是因为contains是用于非主键属性的过滤器操作,而排序键属于主键,必须在Key Condition Expression中处理,不能放在过滤器里
内容的提问来源于stack exchange,提问作者alockrem
相关产品推荐
相关产品推荐

