AWS AppSync对接DynamoDB使用IN运算符查询问题及替代方案咨询
针对AppSync无IN运算符的可行替代方案
方案1:OR组合多个eq条件(无改造成本首选)
- 直接使用AppSync默认支持的
or逻辑运算符,拼接多个等值匹配条件,即可实现和IN完全一致的查询效果,示例查询语句如下:
query MyQuery { listResults(filter: { or: [ {state: {eq: "TX"}}, {state: {eq: "IL"}} ] }) { items { id state value } } }
- 无需修改任何Resolver、表结构或Schema定义,适合查询目标枚举值数量少于10个的场景。
方案2:自定义VTL Resolver原生支持IN运算符
- 如果你需要批量查询大量枚举值,拼接OR条件过于繁琐,可以通过自定义Resolver的方式让AppSync直接支持IN语法:
- 首先修改GraphQL Schema,给字符串过滤类型新增
in参数定义:
input ModelStringFilterInput { eq: String ne: String le: String lt: String ge: String gt: String contains: String notContains: String between: [String] beginsWith: String in: [String] # 新增该行定义IN运算符入参 }
- 修改
listResults对应的Resolver请求映射模板,识别in参数并组装DynamoDB原生支持的IN查询条件:
#set( $filterExpression = "" ) #set( $expressionAttributeNames = {} ) #set( $expressionAttributeValues = {} ) ## 处理state字段的IN查询逻辑 #if( $ctx.args.filter.state.containsKey("in") ) #set( $filterExpression = "#state IN :stateList" ) $!expressionAttributeNames.put("#state", "state") $!expressionAttributeValues.put(":stateList", $ctx.args.filter.state.in) #end ## 原有其他过滤逻辑保持不变 ## ... { "version": "2017-02-28", "operation": "Scan", "filter": $util.toJson($filterExpression), "expressionAttributeNames": $util.toJson($expressionAttributeNames), "expressionAttributeValues": $util.toJson($expressionAttributeValues) }
- 配置完成后你最初写的带
in参数的查询语句就可以直接正常执行。
方案3:全量查询后客户端过滤
- 如果你的表总数据量不超过1000条,也可以直接不带过滤条件调用
listResults拉取全量数据,在客户端代码层面自行筛选符合state条件的条目,开发成本最低。
内容的提问来源于stack exchange,提问作者Joe Bringley
相关产品推荐
相关产品推荐

