1

给定一个dynamodb带有hash-keyand的表sort-key,如何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'

一个类似的问题不适用于我的情况,因为“最后”操作是针对特定哈希键的,而此查询是针对所有哈希键的。

预先感谢您的考虑和回复。

4

2 回答 2

3

这可能不是您要寻找的答案,但DynamoDB 不具备支持这一点所需的复杂查询功能。您正在尝试做的更适合关系数据库;与大多数情况不同,DynamoDB 仅对单个文档进行操作,不维护查询状态。

当您提前不知道键时,只有两种操作支持搜索记录:

  • 查询需要一个分区键,并且只搜索该分区键下的文档。它适用于查找具有单个分区键的最大排序键的记录,如您找到的问题中所示,但它一次不能应用于多个分区键。

  • Scan搜索整个表,但它只能将过滤器应用于每个单独的记录。它没有任何分组的概念,也不维护任何状态,因此它无法跟踪它遇到的每个分区键的最高排序键值。

可以看到,这些操作都不完全适合您想要做的事情:您想要搜索整个表,就像扫描一样,但想要将分区键下的每组记录视为一个组,就像查询一样。

最重要的是,这些操作是分页的,并且在每次调用时只搜索一组有限的数据。单个扫描操作很可能会在具有相同分区键的一组记录的中间中断。即使 DynamoDB 确实支持有状态查询,它也可能得出错误的结果,因为它没有查看该分区键下的整个记录​​集。

代码解决方案

由于您只能通过在自己的代码中执行查询来实现此目的,因此最简单的解决方案是扫描整个表并跟踪每个分区键分组的排序键最高的文档。对于大型数据集,这可能会非常缓慢且昂贵。

如果您担心表的大小,您可以创新并使用第二个表来存储使用事务写入的每个分区键的最高排序键。对于大型数据集,这仍然会有些昂贵,但不会像扫描整个表那样昂贵。

如果这旨在成为某种版本控制系统,您通常只想获取文档的最新版本,您可能需要考虑配置表流,删除排序键,然后覆盖整个文档。当您覆盖文档时,旧文档将被写入流中。您可以创建一个非常基本的 lambda,它从流中读取并将每个旧文档写入存档表,使用版本作为排序键。

于 2020-01-02T22:56:50.640 回答
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":然后它现在应该返回所有具有最大排序键的唯一哈希键。

于 2020-01-03T17:39:27.257 回答