DynamoDB ValidationException 提供的关键元素与模式不匹配

DynamoDB ValidationException The provided key element does not match the schema

我正在尝试使用 Lambda 函数从 DynamoDB 检索项目,但总是遇到相同的错误:

ValidationException The provided key element does not match the schema

这就是我目前尝试提取数据的方式。 myAttribute 不是字符串,如 here. Since value is a variable taken from queryStringParamters, I am using the DocumentClient 支持原生 JS 类型:

  const AWS = require("aws-sdk")
  const ddb = new AWS.DynamoDB.DocumentClient()

  const getParams = {
    TableName: "myTable",
    Key: { myAttribute: value },
  }

  ddb.get(getParams, function(error, data) {
    if (error)
    {
      console.log("get error", error)
    }
    else
    {
      console.log("get success", data)
    }
  })

架构:

myTable:
  Type: AWS::DynamoDB::Table
  Properties:
    TableName: myTable
    AttributeDefinitions:
      - AttributeName: myAttribute
        AttributeType: S
      - AttributeName: myOtherAttribute
        AttributeType: S
    KeySchema:
      - AttributeName: myAttribute
        KeyType: HASH
      - AttributeName: myOtherAttribute
        KeyType: RANGE
    BillingMode: PAY_PER_REQUEST

我尝试的一些替代方法可以在下面找到。它们都是基于我在文档中看到的各种实现。我已经尝试了下面所列内容的组合,但我只列出了一些,以便在不让 post 太长的情况下了解我尝试过的内容。例如,下面我提到我尝试在使用 DocumentClient 时指定 API 版本。在不使用客户端的情况下,我也尝试过相同的方法。

指定 apiVersion,如 here:

  const ddb = new AWS.DynamoDB.DocumentClient({ apiVersion: "2015-03-31" })

作为字符串的属性,如所见 here:

  const getParams = {
    TableName: "myTable",
    Key: { "myAttribute": value },
  }

不使用DocumentClient,在Key结构中指定S,如here:

  const ddb = new AWS.DynamoDB({ apiVersion: "2015-03-31" })

  const getParams = {
    TableName: "myTable",
    Key: { "myAttribute": { S: value } },
  }

我不太确定如何从这里开始。我想我需要使用 DocumentClient 因为它支持原生 JS 类型,但无论我使用哪种 Key,都会出现相同的错误。关于如何解决此问题的任何想法?

您正在使用文档客户端的 get 方法,它映射到基础 GetItem API 调用。此 API 调用需要 return 项目的整个主键。在您的情况下,这意味着您必须知道项目的 partition/hash 和 sort/range 键。

既然不是你在评论中提到的情况,我建议你使用Query API。查询对项目集合(共享分区键的所有项目)进行操作,并允许您 return 整个项目集合或根据排序键在项目集合中过滤。