ValidationException:提供的key元素与架构不匹配

时间:2015-08-08 05:13:46

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

我在dynamoDB中创建了一个表'user_info',其中包含一个主哈希键'user_id'(String),没有范围键。然后我创建了2个aws lambda函数来插入和查询项目。我可以在表中插入项目,但是当我查询表时,它返回ValidationException:提供的key元素与模式不匹配。我的查询功能:

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被定义为String。我真的不知道为什么会出现不匹配错误。

4 个答案:

答案 0 :(得分:27)

为了进一步澄清为什么会发生这种情况,您最初使用的是DynamoDB Document Client,这消除了需要明确地将您的属性标记为" String" (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'
};

注意" S"包装" user_id"的值从上面的代码中删除。稍后,您使用' aws-sdk'切换回低级javascript sdk,因此您的代码使用" S"标签最终起作用。

答案 1 :(得分:15)

最后,我找到了答案。它不是关于params的格式,而是关于它之前的代码,我没有在我的问题中发布。当我更换

EnvDTE.DTE

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

异常消失。

答案 2 :(得分:2)

(与OP不同的场景)

当我的表同时具有 HASH SORT HASH 键进行查询时,我也发生了同样的错误。 >键。我删除了未使用的 SORT 键,因为它对我来说不是必需的,它解决了我的问题。

答案 3 :(得分:0)

此错误也可能是由一个简单的编码错误引起的,其中查询键的数据类型与模式中定义的数据类型不同。

例如,密钥在架构中定义为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),
    },
},})