DynamoDB - Key元素与架构不匹配

时间:2016-04-08 18:13:50

标签: amazon-web-services

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

  

提供的关键元素与架构

不匹配

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

{
  "email": "test@email.com",
  "password": "123",
  "registration": 1460136902241,
  "verified": false
}

以下是表格信息

  • 表名:用户
  • 主分区键: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.");
        });


    });

};

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

4 个答案:

答案 0 :(得分:32)

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

答案 1 :(得分:6)

对于其他面临相同挑战且上述答案未解决问题的人,最好总是再次检查要更新的值的数据类型,在我的情况下,主键期望一个数字,而我尝试用字符串更新。愚蠢的我

答案 2 :(得分:0)

遇到此问题时的清单:

  1. 检查密钥的名称和类型是否与数据库中的密钥相对应。
  2. 使用相应的属性使其明确。例如。在Java中使用@DynamoDBHashKey(attributeName = "userId")来表示名为userId的分区键。
  3. 确保您的课程中只有一个字段或获取方法标记为分区键。

请在评论中添加更多内容。

答案 3 :(得分:0)

我正在执行 BatchGetItem,然后将其流式传输到 BatchWriteItem(删除)。 DeleteItem 不喜欢它从对象中获取所有属性,而不仅仅是分区和排序键。

收集所有答案:

  • 属性名称不匹配
  • 属性类型不匹配
  • 提供半键
  • 不必要的附加键