我正在尝试使用boto3来获取主键的最大值(在特定情况下为id
)。
表结构:
| id | name |
|-----|-------|
| 1 | Bob |
| 4 | Alice |
| 5 | Eve |
其中id
是主键(哈希键),而没有排序键(范围键)。
结果,我应该得到5(最大值id
)。
ScanIndexForward
方法中的 table.scan()
属性需要排序键。 table.query()
方法需要条件(例如Key={"name":"Bob"}
)。
id
值不是自动递增的(表可能缺少id
值),这就是this解决方案无济于事的原因。
问题:是否可以从没有排序键的表中获取最大的id
? (当然,我不想扫描 all 表并使用python找到它。)
感谢阅读!
答案 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
。