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 整个项目集合或根据排序键在项目集合中过滤。
我正在尝试使用 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 整个项目集合或根据排序键在项目集合中过滤。