我正在尝试更新我的Dynamodb表+用户+中的项目。我尝试了很多不同的方法,但我总是收到相同的错误消息:
提供的关键元素与架构
不匹配
项目的创建起作用,以及查询但不是更新。当我检查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.");
});
});
};
你知道我的代码中有什么问题吗?
答案 0 :(得分:32)
您只提供一半的主键。您的主键是分区键和范围键的组合。您需要在更新参数中的Key
属性中包含范围键。
答案 1 :(得分:6)
对于其他面临相同挑战且上述答案未解决问题的人,最好总是再次检查要更新的值的数据类型,在我的情况下,主键期望一个数字,而我尝试用字符串更新。愚蠢的我
答案 2 :(得分:0)
遇到此问题时的清单:
@DynamoDBHashKey(attributeName = "userId")
来表示名为userId
的分区键。请在评论中添加更多内容。
答案 3 :(得分:0)
我正在执行 BatchGetItem
,然后将其流式传输到 BatchWriteItem
(删除)。 DeleteItem
不喜欢它从对象中获取所有属性,而不仅仅是分区和排序键。
收集所有答案: