【问题标题】:return all hash-key items with maximum sort-key in dynamodb using boto3使用 boto3 在 dynamodb 中返回所有具有最大排序键的哈希键项
【发布时间】:2020-04-13 00:53:51
【问题描述】:
给定一个带有hash-key 和sort-key 的dynamodb 表,如何使用boto3 查询排序键为特定哈希键最大值的所有哈希键项?
例如,如果表是
HK SK Value
A 1 'foo'
2 'bar'
B 1 'boo'
2 'far'
3 'faz'
C 1 'baz'
要检索的 boto3 查询是什么
A 2 'bar'
B 3 'faz'
C 1 'baz'
a similar question 不适用于我的情况,因为“最后”操作是针对特定哈希键的,而此查询是针对所有哈希键的。
提前感谢您的考虑和回复。
【问题讨论】:
标签:
python-3.x
amazon-dynamodb
boto3
dynamodb-queries
【解决方案1】:
没有办法通过使用单个查询来实现这一点,你可以做的是为每个哈希键设置一个特殊的行,如下所示:
GSI
HK SK Value
A "special_row" 2
A 1 'foo'
A 2 'bar'
B "special_row" 3
B 1 'boo'
B 2 'far'
B 3 'faz'
C "special_row" 1
C 1 'baz'
那些特殊的行存储你见过的最大排序键给哈希键。因此,每当您需要插入新行时,您都需要将其与现有的特殊行进行比较,以查看是否也需要对其进行更新。
之后,您可以在排序键上构建一个全局二级索引并像这样进行查询:
select * where SK = "special_row"。然后它现在应该返回所有具有最大排序键的唯一哈希键。
【解决方案2】:
这可能不是您要寻找的答案,但 DynamoDB 不具备支持此问题所需的复杂查询功能。您尝试做的事情更适合关系数据库;与大多数情况不同,DynamoDB 仅对单个文档进行操作,不维护查询状态。
在不知道key的情况下,只有两种操作支持搜索记录:
您可以看到,这些操作都不是完全适合您想要做的事情:您想要搜索整个表,就像扫描一样,但想要将分区键下的每组记录视为一个组,例如一个查询。
最重要的是,这些操作是分页的,每次调用只搜索一组有限的数据。单个扫描操作很可能会在具有相同分区键的一组记录的中间中断。即使 DynamoDB 确实支持有状态查询,它也可能得出错误的结果,因为它没有查看该分区键下的整个记录集。
代码解决方案
由于您只能通过在自己的代码中执行查询来实现此目的,因此最简单的解决方案是扫描整个表并跟踪每个分区键分组的排序键最高的文档。对于大型数据集,这可能会非常缓慢和昂贵。
如果您担心表的大小,您可以创新并使用第二个表来存储每个分区键的最高排序键(使用事务性写入)。对于大型数据集,这仍然会有些昂贵,但不会像扫描整个表那样昂贵。
如果这旨在成为某种版本控制系统,您通常只想获取文档的最新版本,您可能需要考虑配置表流,删除排序键,然后覆盖整个文档。当您覆盖文档时,旧文档将被写入流中。您可以创建一个非常基本的 lambda,它从流中读取并将每个旧文档写入存档表,使用版本作为排序键。