我正在将 appsync 解析器与 dynamoDB 结合使用。我有一个包含一些作业项目记录的表,每个作业跨越一组项目,每个项目都是一个具有特定状态的任务:[“待处理”、“成功”、“失败”]。
我在表上使用“id”作为主键,“jobId”作为辅助索引键。
我想查询我的表以查找与给定“jobId”相关且已成功的所有项目,但我不知道如何构建此类查询(如果可能的话)?
这是一个有效的查询,但它不允许指定项目状态,因此它返回作业的所有项目:
import * as appsyncUtils from "@aws-appsync/utils"
export function request(
ctx: appsyncUtils.Context<QueryGetJobItemsArgs>
): appsyncUtils.DynamoDBQueryRequest {
const { limit = 100, jobId, nextToken } = ctx.arguments;
return {
operation: "Query",
query: {
expression: "#jobId = :jobId",
expressionNames: {
"#jobId": "jobId",
},
expressionValues: {
":jobId": util.dynamodb.toDynamoDB(jobId),
},
},
index: "jobIdIndex",
nextToken,
limit
}
}
我尝试了以下查询,但它不起作用,因为状态不是关键:
import * as appsyncUtils from "@aws-appsync/utils"
export function request(
ctx: appsyncUtils.Context<QueryGetJobItemsArgs>
): appsyncUtils.DynamoDBQueryRequest {
const { limit = 100, jobId, status, 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: "jobIdIndex",
nextToken,
limit
}
}
我需要使用扫描或修改我的表格吗?
您需要使用
filter
来表示状态,因为您是正确的,它不是钥匙:
import * as appsyncUtils from "@aws-appsync/utils"
export function request(
ctx: appsyncUtils.Context<QueryGetJobItemsArgs>
): appsyncUtils.DynamoDBQueryRequest {
const { limit = 100, jobId, status, nextToken } = ctx.arguments;
return {
operation: "Query",
query: {
expression: "#jobId = :jobId",
expressionNames: {
"#jobId": "jobId"
},
expressionValues: {
":jobId": util.dynamodb.toDynamoDB(jobId),
},
},
filter: {
expression: "#status = :status",
expressionNames: {
"#status": "status",
},
expressionValues: {
":status": util.dynamodb.toDynamoDB(status),
},
}
index: "jobIdIndex",
nextToken,
limit
}
}