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

时间:2016-03-08 07:01:29

标签: amazon-dynamodb

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

2 个答案:

答案 0 :(得分:27)

我首先要说的是,在不知道哈希密钥的情况下查询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   ║
╚══════════════════════╩════════════════════════╩════════════════╝

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

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

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

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

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

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

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

答案 1 :(得分:1)

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

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

来自AWS docs

  

全球二级指数不强制执行唯一性

因此,Global Secondary Indices(GSI)的范围键是可选的,GSI的复合键不需要唯一标识任何记录。