如何根据key+属性查询dynamoDB?

问题描述 投票:0回答:1

我正在将 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
  }
}

我需要使用扫描或修改我的表格吗?

amazon-web-services amazon-dynamodb aws-appsync-resolver
1个回答
0
投票

您需要使用

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
  }
}

https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-query.html

© www.soinside.com 2019 - 2024. All rights reserved.