我是Dynamodb的新手。我想查询Dynamodb中的所有记录以及分页。所以我只想要最近行的100条记录。在我的表中,我有包含date and time
的created
数据。如果我为created
创建GSI
,那么我必须提供分区密钥作为当前日期或任何日期。但是我不知道表上的时间。有其他方法可以分页吗?
表格结构:
---------------------------------------------
|id | created | action_type |
---------------------------------------------
|hash | 21:22 20/10/2018| some_type |
|hash | 10:12 10/11/2018| some_type |
DynamoDB的设计意味着它不是特别擅长返回所有项目。
返回所有项目是一个SCAN
,尽管它允许您对返回的项目施加限制,但它总是未排序的。
获得排序响应的唯一方法是在具有分区和排序键的表上QUERY
。在这种情况下,您可以在partition
上查询,它将返回按sort
排序的结果(支持升序/降序(。
还有一个问题给出了一个更大的讨论,关于可以对扫描进行排序的修复,但实际上它可以分解为:
- 在每个项目中都有一个设置为相同的属性(我们称之为
scannable
,它将设置为scan_me
( - 使用分区
scannable
创建全局辅助索引并对created
键进行排序 - 查询
scannable == "scan_me"
,它将返回表中的所有数据(最多为limit
,按created
的字符串顺序
这不是一个可扩展的解决方案,但它可以"工作"于少量数据。请注意,正如@matthew-pope所指出的,您的created
密钥不排序(或者,更具体地说,它按小时-分钟-天-月-年排序(,这意味着您还需要将created
密钥替换为epoch秒或ISO日期字符串(因为这两个密钥都使用默认比较器排序(。
最后如果TOP N
对您很重要,那么可能有一个使用dynamodb -> dynamodb streams -> lambda -> another dynamodb table
模式来维护实体化视图的解决方案。(这种模式通常是建议的解决方案,以支持发电机中更复杂的"查询"。(