如何基于键+属性查询DynamoDB?AppSync解析器场景
解决AppSync+DynamoDB查询指定jobId下特定状态作业项的问题
你当前的问题核心是DynamoDB的Query操作只能在索引的键上做过滤,现有的jobIdIndex仅将jobId作为索引键,所以无法直接在Query中添加status的过滤条件。以下是两种可行方案:
方案一:修改二级索引(推荐)
创建一个新的二级全局索引(GSI),将jobId设为分区键,status设为排序键。这样就能通过Query同时过滤jobId和status,性能远优于Scan操作。
修改后的AppSync解析器代码如下:
import * as appsyncUtils from "@aws-appsync/utils" export function request( ctx: appsyncUtils.Context<QueryGetJobItemsArgs> ): appsyncUtils.DynamoDBQueryRequest { const { limit = 100, jobId, status = "succeed", nextToken } = ctx.arguments; return { operation: "Query", query: { expression: "#jobId = :jobId AND #status = :status", expressionNames: { "#status": "status", "#jobId": "jobId", }, expressionValues: { ":status": util.dynamodb.toDynamoDB(status), ":jobId": util.dynamodb.toDynamoDB(jobId), }, }, index: "jobIdStatusIndex", // 替换为你新创建的索引名称 nextToken, limit } }
注意:新索引创建后需要等待数据完全同步,之后才能正常执行查询。
方案二:使用Scan操作(不推荐)
如果暂时无法修改表结构,可以用Scan操作配合过滤条件,但Scan会遍历表中所有数据,数据量较大时会导致性能下降、延迟升高,且消耗更多读取容量单位(RCU)。
对应的解析器代码:
import * as appsyncUtils from "@aws-appsync/utils" export function request( ctx: appsyncUtils.Context<QueryGetJobItemsArgs> ): appsyncUtils.DynamoDBScanRequest { const { limit = 100, jobId, status = "succeed", nextToken } = ctx.arguments; return { operation: "Scan", filter: { expression: "#jobId = :jobId AND #status = :status", expressionNames: { "#status": "status", "#jobId": "jobId", }, expressionValues: { ":status": util.dynamodb.toDynamoDB(status), ":jobId": util.dynamodb.toDynamoDB(jobId), }, }, nextToken, limit } }
提示:仅当表中数据量极小(如几千条以内)时,才建议临时用Scan过渡,长期来看优先选择方案一优化索引结构。
内容的提问来源于stack exchange,提问作者Felipe
相关产品推荐
相关产品推荐

