【问题标题】:DynamoDB - Key element does not match the schemaDynamoDB - 关键元素与架构不匹配
【发布时间】: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.");
        });


    });

};

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

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb


    【解决方案1】:

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

    【讨论】:

    • 它有效,谢谢!但是是否可以仅将电子邮件地址作为主键?
    • 是的,可以只使用电子邮件地址作为主键。 docs.aws.amazon.com/amazondynamodb/latest/developerguide/…
    • 可能是键名有错别字,这发生在我身上
    • 如果你还想只通过PK查询,你必须使用'query',而不是'get'方法。在这种情况下,您只能提供 KeyConditionExpression: 'PK = xxx'。
    • 我的表中没有范围键,我提供了分区键,但在调用 deleteItem 时出现此错误。是否还有其他可能导致此错误的情况?
    【解决方案2】:

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

    【讨论】:

    • 我也有一个愚蠢的问题。我的表是使用复合键(即主键和排序键)创建的。在现实中,我只想要一个主键体验。经验教训——提前计划!
    【解决方案3】:

    我遇到这个问题时的清单:

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

    如果您在 cmets 中知道,请添加更多内容。

    【讨论】:

      【解决方案4】:

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

      收集所有答案:

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

      【讨论】:

        【解决方案5】:

        我的问题是用于删除的 Node SDK,documentation 说要提供格式:

        ... {Key: {'id': {S: '123'}}} ...
        

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

        ... {Key: {'id': '123'}} ...
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-08-26
          • 2019-07-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-14
          • 1970-01-01
          相关资源
          最近更新 更多