DynamoDB 项目列表中的分页

Pagination in DynamoDB list of items

我有一个项目列表,我可以在位置属性上实现分页,例如从索引 0 到 10、10 到 20 获取...

{
 continent:String,
 country:String,
 locations:[ {address,phone},{address,phone}....]
}

DynamoDB 读取请求(例如,GetItem)有一个 ProjectionExpression 选项,您可以在其中传递属性列表以及要从项目中获取的子属性,而不是整个项目。所以你可以使用

ProjectionExpression="locations[10],locations[11],...,locations[19]"

GetItem return 只有“位置”列表中的元素 10..19。不幸的是,没有更短的语法来获取索引范围。

但是,您应该知道,即使您只要求阅读列表中的元素 10..19,您实际上也会付费 阅读整个项目。 DynamoDB 假定项目(在您的示例中是整个项目)相当小(硬限制为 400 KB),并且对项目的任何读取或写入 - 即使只是其中的一部分 - 都会产生与长度成比例的成本整个项目。因此,尽管您可以使用我刚才描述的语法进行分页,但它通常不是一种经济高效的方法。如果您阅读 20“页”中的一个项目,您将支付阅读同一项目 20 次的费用!你最好只获取整个项目(同样,它的大小是有限的)一次并在客户端中分页。

当谈论 分页 是一种有效的方法时,通常会讨论同一 分区 中的多个项目,即多个项目具有相同的哈希键和不同的排序键。然后,您可以使用 Query 请求翻阅这些项目,并且您只需为翻阅的项目付费。使用这种方法,“列表”(它不是真正的列表,而是许多单独的项目)的长度实际上是无限的。