【问题标题】:ValidationException: The provided key element does not match the schemaValidationException:提供的关键元素与架构不匹配
【发布时间】:2015-10-31 14:47:32
【问题描述】:

我在 DynamoDB 中创建了一个表“user_info”,其中一个主哈希键“user_id”(字符串),没有范围键。然后我创建了 2 个 AWS lambda 函数来插入和查询项目。我可以将项目插入表中,但是当我查询表时,它会返回:

ValidationException: 提供的关键元素不匹配 架构。

我的查询功能:

var params = {
   Key: {
       user_id:{
           S: "usr1@s.com"
       }
   },
    TableName: 'user_info',
    ProjectionExpression: 'password'
};

dynamodb.getItem(params,
 function(err, data) {
    if (err) {
        console.log("get item err." + err);
        context.done('error','getting item from dynamodb failed: '+err);
    }
    else {
        console.log('great success: '+JSON.stringify(data, null, '  '));
        context.succeed('created user ' + event.user_id + ' successfully.');
    }
});

我不断收到此异常:

ValidationException: The provided key element does not match the schema

自从

1) 我只有一个哈希主键。

2)user_id 定义为字符串。我真的不知道为什么会出现不匹配错误。

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb aws-lambda


    【解决方案1】:

    我终于找到了答案。这与参数的格式无关,而是与它之前的代码有关,我没有在我的问题中发布。当我更换

    var doc = require('dynamodb-doc');
    var dynamodb = new doc.DynamoDB();
    

    var doc = require('aws-sdk');
    var dynamodb = new doc.DynamoDB();
    

    异常消失了。

    【讨论】:

    • 谢谢。这对我有帮助..:)
    • 太棒了!感谢一百万,一旦您在此处阅读它们,有些事情似乎很明显。
    【解决方案2】:

    为了进一步阐明为什么会发生这种情况,您最初使用的是 DynamoDB Document Client,这样就无需将您的属性显式标记为“字符串”(S) 或“数字”(N) 等。因此,您原来的代码可以使用

    var doc = require('dynamodb-doc');
    var dynamodb = new doc.DynamoDB();
    
    var params = {
    Key: {
       user_id: "usr1@s.com"
    },
    TableName: 'user_info',
    ProjectionExpression: 'password'
    };
    

    请注意,包装“user_id”值的“S”已从上述代码中删除。稍后,您使用“aws-sdk”切换回低级 javascript sdk,因此带有“S”标签的代码最终可以正常工作。

    【讨论】:

    • 非常感谢!我一直讨厌 DynamoDb 的类型,并且不知道 Document Client(现在是官方 SDK 的一部分)。你的回答让我省了不少心!
    • 非常有用,我只使用了新的 AWS.DynamoDB,我必须包含属性类型,当我切换到使用新的 AWS.DynamoDB.DocumentClient() 时,我不断收到“ValidationException:提供的关键元素与架构不匹配”而不告诉我出了什么问题。省略属性类型修复了错误!
    • 当我试图让我的代码尽可能接近 AWS 代码示例、官方文档时,我遇到了同样的问题。当我删除“S”和“N”并恢复为旧样式时,错误消失了!我什至甚至创建了一个索引并尝试了各种其他的事情,因为错误消息无助于缩小来源!我认为现在是 AWS 更新文档的时候了:就文档而言,一致性不是我会为 AWS 使用的词。非常感谢丹妮拉。
    【解决方案3】:

    (与OP不同的场景)

    当我的表同时具有 HASHSORT 时,当我尝试仅通过 HASH 键进行查询时,同样的错误发生在我身上> 钥匙。我删除了未使用的 SORT 键,因为我不需要它,它解决了我的问题。

    【讨论】:

      【解决方案4】:

      此错误也可能是由查询键的数据类型与架构中定义的不同的简单编码错误引起的。

      例如,密钥在架构中定义为String(参见AttributeDefinitions):

       resources:
       Resources:
         RemarksDynamoDbTable:
           Type: "AWS::DynamoDB::Table"
           DeletionPolicy: Retain
           Properties:
             TableName: "chat-admin-${opt:stage, self:provider.stage}"
             ProvisionedThroughput:
               ReadCapacityUnits: 1
               WriteCapacityUnits: 1
             AttributeDefinitions:
               - AttributeName: id
                 AttributeType: S         
             KeySchema:
               - AttributeName: id
                 KeyType: HASH 
      

      但查询时指定为Number(N):

      result, err := svc.GetItem(&dynamodb.GetItemInput{
      TableName: aws.String(table),
      Key: map[string]*dynamodb.AttributeValue{
          "id": {
              N: aws.String(key),
          },
      },})
      

      【讨论】:

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