我希望在没有HashKey的情况下查询Dynamo DB。我尝试过使用扫描,但它很昂贵,所以寻找其他替代方案。
答案 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 cat
和324090 - Cat Logic
。
答案 1 :(得分:1)
我部分同意Matias发布的答案。您可以在表格上创建全局二级索引(使用哈希键和可选范围键)。
但是,我不同意他在后面的回答中所说的内容:“我们需要指定一个范围键,因为仅作为哈希键的教师将生成重复的条目”。我不能在他的回答下面发表评论,因为我没有足够的声誉。出于某种原因,我无法编辑他的答案。
来自AWS docs:
全球二级指数不强制执行唯一性
因此,Global Secondary Indices(GSI)的范围键是可选的,GSI的复合键不需要唯一标识任何记录。