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

时间:2014-09-17 09:05:52

标签: python amazon-web-services amazon-dynamodb boto

有没有办法根据不是哈希键的字段获取项目?

实施例

我的表用户:id (HashKey), name, email

我想要检索发送电子邮件的用户为' test@mail.com'

如何做到这一点?

我用boto尝试这个:

user = users.get_item(email='john.doe@gmail.com')

我收到以下错误:

'The provided key element does not match the schema'

6 个答案:

答案 0 :(得分:20)

以下内容适用于AWS Lambda环境中的Node.js AWS SDK:

这对我来说很粗糙。我在尝试使用getItem方法时遇到了这个问题。无论我尝试什么,我都会继续收到此错误。我终于在AWS论坛上找到了一个解决方案:https://forums.aws.amazon.com/thread.jspa?threadID=208820

令人费解的是,明显的解决方案与我能找到的所有AWS文档冲突。

以下代码对我有用:

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

var params = { }
params.TableName = "ExampleTable";
var key = { "ExampleHashKey": "1" };
params.Key = key;

dynamo.getItem(params, function(err, data) {
    if (err)
        console.log(err);
    else
        console.log(data)
});

答案 1 :(得分:11)

要查询不是哈希键的字段,您需要使用全局二级索引(GSI)。有关GSI的详细信息,请查看this AWS Post

2015年2月更新:现在可以将GSI添加到现有表中。有关详细信息,请参阅Amazon Docs

遗憾的是you cannot add a GSI to an existing DynamoDB table所以你需要创建一个新表并移植你的数据,如果这是你真正需要查询的东西。

来自DynamoDB FAQ

  

问:如何为DynamoDB表创建全局二级索引?

     

必须在创建表时指定与表关联的所有GSI   时间。此时,无法在表格后添加GSI   已经被创造了。有关创建表及其的详细步骤   索引,请参阅here。您可以为每个表创建最多5 global secondary indexes个。   

如果您不想移植数据,可以考虑创建第二个DynamoDB表,将电子邮件作为哈希键和父记录的哈希值,用作查找主数据表但是当你可以想象这不是一个最佳的解决方案,它带来了让你与主表保持同步的麻烦。

答案 2 :(得分:8)

当我发送字符串而不是整数时,我也遇到了这个错误。

当然,这是我写入数据库的时候,而不是从中读取。

答案 3 :(得分:1)

我在Java中遇到此错误,因为我使用了@DynamoDBHashKey注释来获取RANGE键。我不得不使用@DynamoDBRangeKey注释代替我的对象的id。

答案 4 :(得分:0)

我在Java应用程序中遇到此错误,因为我在DAO类中意外地有两个注解(@DynamoDBRangeKey)的范围键,而此时应该只有一个。我将新添加的注解更改为@ DynamoDBAttribute,就解决了。

答案 5 :(得分:0)

我的桌子上有分区键和排序键。

我只用分区键查询它,但出现此错误。

很明显,通过查询组合键可以解决此问题。