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 - 提供的关键元素与架构不匹配

AWS dynamoDB - batchWrite - 提供的关键元素与架构不匹配

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

从 DynamoDB 获取项目时出现“提供的关键元素与架构不匹配”错误

我们可以通过 AWS SDK 使用 GSI 删除 DynamoDB 中的项目吗?