DynamoDB - Key元素与架构不匹配

use*_*502 20 amazon-web-services

我正在尝试更新我的Dynamodb表+用户+中的项目.我尝试了很多不同的方法,但我总是收到相同的错误消息:

提供的关键元素与架构不匹配

项的创建起作用,以及查询但不是更新.当我检查DynamoDB时,用户创建得很好:

{
  "email": "test@email.com",
  "password": "123",
  "registration": 1460136902241,
  "verified": false
}
Run Code Online (Sandbox Code Playgroud)

这是表格信息:

  • 表名:用户
  • 主分区键:email(String)
  • 主要排序键:注册(号码)

这是代码(从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.");
        });


    });

};
Run Code Online (Sandbox Code Playgroud)

你知道我的代码中有什么问题吗?

Mar*_*k B 37

您只提供一半的主键.您的主键是分区键和范围键的组合.您需要Key在更新参数中包含属性中的范围键.

  • 如果您仍然想仅通过 PK 查询,则必须使用“query”,而不是“get”方法。在这种情况下,您只能提供 KeyConditionExpression: 'PK = xxx'。 (5认同)

har*_*ren 13

对于其他面临相同挑战并且问题未通过上述答案解决的人,最好仔细检查正在更新的值的数据类型,在我的情况下,主键需要一个数字,而我正在尝试更新用字符串。傻我

  • 我也有一个愚蠢的问题。我的表是使用复合键(即主键和排序键)创建的。事实上,我只想要一种主要的关键体验。吸取的教训——提前计划! (2认同)

pla*_*ard 7

我的问题是用于删除的 Node SDK,文档中说要提供以下格式:

... {Key: {'id': {S: '123'}}} ...
Run Code Online (Sandbox Code Playgroud)

这似乎不适用于aws-sdk ^2.1077.0. 这似乎有效:

... {Key: {'id': '123'}} ...
Run Code Online (Sandbox Code Playgroud)