使用boto3从DynamoDB表中获得最大的主键值

时间:2018-11-03 01:42:12

标签: python-3.x amazon-web-services amazon-dynamodb boto3

我正在尝试使用boto3来获取主键的最大值(在特定情况下为id)。

表结构: | id | name | |-----|-------| | 1 | Bob | | 4 | Alice | | 5 | Eve | 其中id是主键(哈希键),而没有排序键(范围键)。

结果,我应该得到5(最大值id)。

我已经想到了docs和这个answer,但没有找到答案。

ScanIndexForward方法中的

table.scan()属性需要排序键。 table.query()方法需要条件(例如Key={"name":"Bob"})。

id值不是自动递增的(表可能缺少id值),这就是this解决方案无济于事的原因。

问题:是否可以从没有排序键的表中获取最大的id? (当然,我不想扫描 all 表并使用python找到它。)

感谢阅读!

1 个答案:

答案 0 :(得分:2)

这可能不是您想听到的-但是您不能直接使用表操作来做到这一点。

Dynamo以创建可伸缩系统的名义给您带来了很多限制。而且其中大多数围绕您具有查询的选项。与传统数据库(further discussion about using scan with some, dubious, suggestions)相比,它提供的密钥文档存储更多。

我建议您看看在分区/排序/索引的限制内访问数据并考虑架构设计所需的方式。

在这种情况下(例如,当您需要从表中派生属性时),可以使用的架构模式为:

DynamoDB
  -> DynamoDB Streams (shares Create/Update/Delete events)
  -> Lambda checks id against a stored value of 'current max id':
       - if create/update and higher, saves 'current max id' and 'last max id'
       - if delete and equal, replace 'current max id' with 'last max id'

在这种情况下,您可以将生成的最大id的“视图”存储在另一个表或版本为s3的文档中。 (n.b.仍然存在一些限制,如果使用此实现删除了两个最大的ID,则可能需要执行scan