AWS AppSync JavaScript Resolver实现DynamoDB多状态批量查询
问题描述
需要编写AWS AppSync的JavaScript请求模板,实现从DynamoDB中查询所有ReviewStatus字段匹配status数组中任一值的条目。已知status为字符串时的实现代码,但尝试用or表达式实现数组匹配时无效,且仅能找到VTL模板的批量查询资料,未找到JavaScript模板的相关内容。
附现有代码:
字符串版可正常运行代码
import { util } from '@aws-appsync/utils'; export function request(ctx) { const { limit = 20, nextToken, status } = ctx.arguments; const index = 'ReviewStatus-index'; const query = JSON.parse( util.transform.toDynamoDBFilterExpression({ ReviewStatus: { eq: status } }) ); return { operation: 'Query', index, query, limit, nextToken }; } export function response(ctx) { const { items, nextToken } = ctx.result; return { items, nextToken }; }
尝试无效的数组版代码
import { util } from '@aws-appsync/utils'; export function request(ctx) { const { limit = 20, nextToken, status } = ctx.arguments; const index = 'ReviewStatus-index'; const query = JSON.parse( util.transform.toDynamoDBFilterExpression({ "or": status.map( s => ({ ReviewStatus: { eq: s } })) }) ); return { operation: 'Query', index, query, limit, nextToken }; } export function response(ctx) { const { items, nextToken } = ctx.result; return { items, nextToken }; }
解决方案
直接使用DynamoDB原生的in操作符即可实现匹配数组中任一值的需求,无需手动构建or表达式。AppSync的util.transform.toDynamoDBFilterExpression工具支持解析in操作符,具体代码如下:
import { util } from '@aws-appsync/utils'; export function request(ctx) { const { limit = 20, nextToken, status } = ctx.arguments; const index = 'ReviewStatus-index'; // 使用in操作符传入status数组,匹配任一元素 const query = JSON.parse( util.transform.toDynamoDBFilterExpression({ ReviewStatus: { in: status } }) ); return { operation: 'Query', index, query, limit, nextToken }; } export function response(ctx) { const { items, nextToken } = ctx.result; return { items, nextToken }; }
说明
in操作符是DynamoDB官方支持的查询条件,用于匹配属性值属于指定数组中的任一元素,比手动构建多个eq的or表达式更简洁高效。- 需确保
ReviewStatus-index全局二级索引(GSI)是以ReviewStatus作为分区键,这样查询可以正确命中索引,避免全表扫描。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

