在没有hashkey或扫描的情况下在Dynamo DB中查询

Mri*_*dul 8 amazon-dynamodb

我希望在没有HashKey的情况下查询Dynamo DB.我尝试过使用扫描,但它很昂贵,所以寻找其他一些替代品.

Mat*_*ero 28

我首先要说的是,在不知道哈希密钥的情况下查询DynamoDB表是不可能的.这是有道理的.

现在,您要使用的哈希键是否是表的主键,取决于您.

例如,假设您有下表:

??????????????????????????????????????????????????????????????????
? course_id (Hash Key) ?      course_name       ?    teacher     ?
??????????????????????????????????????????????????????????????????
? 324234               ? Node.js for Dummies    ? Ryan Dahl      ?
? 213323               ? How to train your cat  ? Jackson Galaxy ?
? 324090               ? Cat Logic              ? Jackson Galaxy ?
? 763298               ? Diving into .NET       ? Eric Lippert   ?
??????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

表的主键和散列键是course_id,这很好.提供唯一的哈希键允许将表拆分为多个分区.

但是,如果我们想获得Jackson Galaxy所教授的所有课程怎么办?

我们不知道course_id那些课程,这就是我们想要的.所以我们发现自己不知道项目的哈希键值.

这就是GSI发挥作用的地方.全局二级索引允许您为表定义不同的哈希键.请注意,它不会更改主哈希键 - course_id仍将是表的哈希键.

GSI仅提供额外的哈希密钥,以便您能够进行更复杂的查询.

假设我们添加一个名为GSI teacher_index,我们说这teacher将是我们的哈希键,并且course_id将是我们的范围键(我们需要指定一个范围键,因为teacher单独作为哈希键将生成重复的条目).

现在我们可以查询我们teacher_index并将其Jackson Galaxy作为哈希键值传入.结果将是213323 - How to train your cat324090 - Cat Logic.


rit*_*777 7

我部分同意 Matias 发布的答案。您可以在表上创建全局二级索引(使用哈希键和可选的范围键)。

但是,我不同意他后来在回答中所说的话:“我们需要指定一个范围键,因为老师单独作为散列键会生成重复的条目”。我不能在他的回答下面发表评论,因为我没有足够的声誉。出于某种原因,我无法编辑他的答案。

从 AWS文档

全局二级索引不强制唯一性

因此,全局二级索引 (GSI) 的范围键是可选的,并且 GSI 的组合键不需要唯一标识任何记录。