有没有办法根据不是哈希键的字段获取项目?
例
我的表用户: 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'
小智.. 27
以下内容适用于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) });
谢谢!问题确实是AWS文档要求一个编组的对象(例如`var key = {“ ExampleHashKey”:{“ S”:“ 1”}}`),而实际的SDK要求一个普通的javascript对象(例如`var key = {“ ExampleHashKey”:“ 1”}`)。这也发生在`update` /`updateItem`方法中 (4认同)
DynamoDB的文档始终是一个挑战。我认为,此问题的根本原因是基本DynamoDB客户端和高级文档客户端之间的区别。基本客户端使用AttributeValues例如var key = {S:{name:'joe'}},而Document Client使用本机JavaScript对象,例如var key = {name:'joe'}。 (4认同)
Wolfwyrd.. 12
要查询不是哈希键的字段,您需要使用全局二级索引(GSI).有关GSI的详细信息,请查看此AWS Post.
更新2015年2月:现在可以将GSI添加到现有表中.有关详细信息,请参阅Amazon Docs.
遗憾的是,您无法将GSI添加到现有的DynamoDB表中,因此如果您确实需要查询,则需要创建新表并移植数据.
从DynamoDB常见问题解答:
问:如何为DynamoDB表创建全局二级索引?
必须在创建表时指定与表关联的所有GSI.此时,在创建表后无法添加GSI.有关创建表及其索引的详细步骤,请参见此处.每个表最多可以创建5个全局二级索引.
如果您不想移植数据,可以考虑创建第二个DynamoDB表,其中电子邮件作为哈希键,父记录的哈希值用作查找主数据表,但您可以想象这不是这是一个最佳解决方案,它带来了与主表保持同步的难题.