首页 文章

按排序顺序查询DynamoDB

提问于
浏览
0

我是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 回答

  • 1

    DynamoDB的设计意味着它不是特别擅长返回所有项目 .

    返回所有项目是 SCAN ,虽然它允许您对返回的项目施加限制,但是always unsorted .

    获取排序响应的唯一方法是在具有 partitionsort 键的表上 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"的建议解决方案 . )

相关问题