有没有办法根据不是哈希键的字段获取项目?
实施例
我的表用户: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'
答案 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)
我的桌子上有分区键和排序键。
我只用分区键查询它,但出现此错误。
很明显,通过查询组合键可以解决此问题。