如何在AWS Amplify GraphQL中对数组内每个元素做条件过滤查询
关于Amplify GraphQL数组元素前缀匹配过滤的问题解答
你提出的对数组内元素应用beginsWith操作符的过滤需求,无法直接通过Amplify默认生成的过滤能力实现,需要通过自定义resolver或者调整数据模型的方式实现。
原因说明
Amplify通过@model指令自动生成的查询过滤能力,底层适配的是DynamoDB的原生查询/扫描条件:
- 针对字符串数组类型的字段,仅支持
contains(精确匹配数组中是否存在完全相同的元素)、notContains、size三类操作符,不支持针对数组内单个元素执行字符串前缀匹配、模糊匹配等操作 - 你示例中的
text_pieces: {items { beginsWith: "First"}}语法,并未包含在Amplify自动生成的过滤器输入类型定义中,直接编写会触发语法校验错误
可选实现方案
方案1:自定义Resolver
如果你的数据量不大,可以直接自定义AppSync Resolver实现需求:
- 可以编写Lambda Resolver,在Lambda代码中遍历查询到的记录,过滤出
text_pieces数组中存在任意元素满足beginsWith条件的记录返回 - 也可以直接修改自动生成的VTL Resolver,在响应映射模板中添加过滤逻辑,筛掉不符合要求的记录
方案2:预处理数据适配原生过滤能力
如果数据量较大,担心自定义Resolver的扫描过滤性能,可以提前对数据做预处理:
- 修改你的schema,新增前缀存储字段:
type Test @model { id: ID! name: String text_pieces: [String] text_piece_prefixes: [String] # 新增前缀存储字段 }
- 写入数据时,自动将每个
text_pieces元素的指定长度前缀存入text_piece_prefixes数组,比如你需要匹配前5位的前缀,就把每个元素的前5位切片存入该数组 - 直接使用Amplify原生的
contains操作符过滤即可:
query FirstPieces { listTests(filter: {text_piece_prefixes: {contains: "First"}}) { items { name text_pieces } } }
内容的提问来源于stack exchange,提问作者madt1m
相关产品推荐
相关产品推荐

