当我尝试为 Amazon DynamoDB 表运行 GetItem 请求时,出现以下错误:“提供的键元素与架构不匹配”。
简短描述
出现此错误的原因可能如下:
- 您为键指定的数据类型不正确。
- 您对属性的命名不正确。
- 您只指定了键的一部分。
- 数据写入了错误的表。
- 存在不必要的额外键。
- 您运行 GetItem 请求来尝试获取一系列项目,而不是单个项目。
- 您的表具有复合主键,因此您可以运行 GetItem 请求而不指定分区键和排序键。
- 您的表没有排序键,因此您可以运行 GetItem 请求并仅指定分区键。
解决方法
查看您的主键和排序键数据类型
要使您的 GetItem 命令成功,主键和排序键数据的数据类型必须与 DynamoDB 表的数据类型相同。在以下示例命令中,排序键 Year 的数据类型为字符串 (S):
aws dynamodb get-item --table-name Key-Element --key '{"EventID":{"S":"test-item01"}, "Year":{"S":"2024"}}'
由于该表使用数字 (N) 数据类型,因此您会收到以下错误消息:
“调用 GetItem 操作时出现错误 (ValidationException): 提供的键元素与架构不匹配”
改为运行以下使用数字数据类型的命令:
aws dynamodb get-item --table-name Key-Element --key '{"EventID":{"S":"test-item01"}, "Year":{"N":"2024"}}'
您收到的输出应类似于以下示例:
{
"Item": {
"EventID": {
"S": "test-item01"
},
"Year": {
"N": "2024"
},
"Works?": {
"N": "1"
}
}
}
为您的用例选择一个操作
使用 BatchGetItem 或 GetItem 操作
当您从 DynamoDB 表检索数据时,可以使用 Getitem 或 BatchGetitem 操作。GetItem 操作一次检索一条记录。请求中必须包含表的键架构。
BatchGetItem 操作要求您为只有分区键的表提供分区键。对于具有复合主键的表,在使用 BatchGetItem 时必须提供分区键和排序键。
使用 Query 操作
要在未指定排序键时检索数据,请使用 Query 操作。由于 Query 允许您在检索数据时仅指定分区键,因此应对具有复合主键的表使用此操作。
使用 DynamoDB Scan API
要根据非键属性来搜索数据,请使用 DynamoDB Scan API。Scan操 作允许您使用 FilterExpression 来根据任何属性筛选数据,而无需指定主键。
要使用非键属性来搜索数据,请在 FilterExpression 中使用嵌套搜索。例如,要搜索嵌套 Data 属性中具有与特定值相匹配的 userId 属性的项目,请使用以下表达式:
"Data.userId": your_expression_values."
**重要事项:**由于 Scan 操作会对所有项目进行迭代以检查是否满足筛选条件,因此该操作会很快产生费用。如果必须使用 Scan 操作,则在扫描大型表时添加分页。Scan API 每次调用最多只能返回 1 MB 的数据。使用分页来仅扫描新数据。