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