DynamoDB - 关键元素与架构不匹配
Posted
技术标签:
【中文标题】DynamoDB - 关键元素与架构不匹配【英文标题】:DynamoDB - Key element does not match the schema 【发布时间】:2016-07-30 03:03:12 【问题描述】:我正在尝试更新我的 Dynamodb 表 +Users+ 中的一个项目。我尝试了许多不同的方法,但总是收到相同的错误消息:
提供的关键元素与架构不匹配
项目的创建和查询一样有效,但更新无效。当我检查 DynamoDB 时,用户创建良好:
"email": "test@email.com",
"password": "123",
"registration": 1460136902241,
"verified": false
这是表格信息:
表名:用户 主分区键:电子邮件(字符串) 主排序键:注册(编号)这是代码(从 lambda 调用):
exports.handler = function(event, context)
var AWS = require("aws-sdk");
var docClient = new AWS.DynamoDB.DocumentClient();
var params =
TableName: "Users",
Item:
email: "test@email.com",
password: "123",
verified: false,
registration: (new Date()).getTime(),
;
// Create the user.
docClient.put(params, function(err, data)
if (err)
context.fail("Put failed...");
return;
var params =
TableName: "Users",
Key: email : "test@email.com" ,
AttributeUpdates:
verified:
Action: "PUT",
Value: true
;
// Update the user.
docClient.update(params, function(err, data)
if (err)
console.log(JSON.stringify(err));
context.fail(JSON.stringify(err));
return;
context.succeed("User successfully updated.");
);
);
;
您知道我的代码有什么问题吗?
【问题讨论】:
【参考方案1】:您只提供了一半的主键。您的主键是分区键和范围键的组合。您需要在更新参数的Key
属性中包含范围键。
【讨论】:
它有效,谢谢!但是是否可以仅将电子邮件地址作为主键? 是的,可以只使用电子邮件地址作为主键。 docs.aws.amazon.com/amazondynamodb/latest/developerguide/… 可能是键名有错别字,这发生在我身上 如果你还想只通过PK查询,你必须使用'query',而不是'get'方法。在这种情况下,您只能提供 KeyConditionExpression: 'PK = xxx'。 我的表中没有范围键,我提供了分区键,但在调用 deleteItem 时出现此错误。是否还有其他可能导致此错误的情况?【参考方案2】:对于面临相同挑战且上述答案未解决问题的其他人,最好仔细检查正在更新的值的数据类型,在我的情况下,主键需要一个数字,而我是尝试用字符串更新。傻了我
【讨论】:
我也有一个愚蠢的问题。我的表是使用复合键(即主键和排序键)创建的。在现实中,我只想要一个主键体验。经验教训——提前计划!【参考方案3】:我遇到这个问题时的清单:
-
检查密钥的名称和类型是否与数据库中的内容相对应。
使用相应的属性使其明确。例如。在 Java 中使用
@DynamoDBHashKey(attributeName = "userId")
表示名为userId
的分区键。
确保您的班级中只有一个字段或 getter 被标记为分区键。
如果您在 cmets 中知道,请添加更多内容。
【讨论】:
【参考方案4】:我正在做BatchGetItem
,然后将其流式传输到BatchWriteItem
(删除)。 DeleteItem
不喜欢它从对象中获取所有属性,而不仅仅是分区和排序键。
收集所有答案:
属性名称不匹配 属性类型不匹配 提供半键 不必要的附加键【讨论】:
【参考方案5】:我的问题是用于删除的 Node SDK,documentation 说要提供格式:
... Key: 'id': S: '123' ...
这似乎不适用于aws-sdk ^2.1077.0
。这似乎有效:
... Key: 'id': '123' ...
【讨论】:
以上是关于DynamoDB - 关键元素与架构不匹配的主要内容,如果未能解决你的问题,请参考以下文章
DynamoDB 简单 UpdateItem 抛出“提供的关键元素与架构不匹配”ValidationException
AWS dynamoDB - batchWrite - 提供的关键元素与架构不匹配
DynamoDB AmazonServiceException:提供的关键元素与架构不匹配