【问题标题】:How to sort DynamoDB table by a single column?如何按单列对 DynamoDB 表进行排序?
【发布时间】:2021-05-17 22:19:32
【问题描述】:

我想列出我的 DDB 表中按创建日期排序的记录。 我的表有一个属性DateCreated

我能找到的所有示例都描述了某个分区内的排序。 但我想要全球订购。 我是否应该创建一个在所有记录中都具有相同值的人工属性,只是将其用作分区键?例如。为表中的每条记录添加新属性GlobalPartition,其值为1,并使用分区键GlobalPartition 和排序键DateCreated 创建一个GSI。没有更好的办法吗?

谢谢!

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb dynamodb-queries amazon-dynamodb-index


    【解决方案1】:

    如果您想对 DynamoDB 中的任何数据进行排序,您需要在该属性上添加排序键索引。如果值不在映射到表的排序键的属性中,或者表没有排序键,那么您需要创建 GSI 并将 GSI 的排序键放在该属性上。您也可以使用 LSI。任何属性,映射到任何索引的“排序键”。表、LSI、GSI。

    查看查询请求的更多详细信息“ScanIndexForward”参数。

    如果 ScanIndexForward 为 true,则 DynamoDB 会按照结果的存储顺序(按排序键值)返回结果。这是默认行为。如果 ScanIndexForward 为 false,则 DynamoDB 按排序键值逆序读取结果,然后将结果返回给客户端。

    https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html#API_Query_RequestSyntax

    UI 也为此设置了复选框:

    “全局排序”是不可能的,而“全局”意味着扫描操作,它只是遍历数据库中的所有行并按过滤器过滤,但它没有排序选项。在查询映射到排序键的属性时,有 ScanIndexForward 选项来更改排序方向。

    【讨论】:

    • Query 需要特定的分区键,并且仅返回具有该键的结果,并按排序键排序。 OP 想要 global 排序。
    • 全局排序是不可能的,而“全局”意味着扫描操作,它只是遍历数据库中的所有行并按过滤器过滤,但它没有排序选项。将此添加到主要答案以进行清除
    【解决方案2】:

    如您所见,DynamoDB 确实没有“全局”排序项目的选项。换句话说,没有办法Scan 按分区键排序的数据库。您只能对一个分区内的项目进行排序,按“排序键”排序。

    当你有少量数据的时候,确实可以做到你说的:有一个分区,这个分区里面的所有东西。但是,当您的单个分区增长到千兆字节或 TB 时,这种方法会变得多么实用,以及当您只有一个分区时 DynamoDB 的负载平衡能力如何(我从未见过任何回答这个问题的 DynamoDB 文档),这一点尚不清楚。

    因此,另一种选择不是拥有一个分区,而是拥有多个分区。例如,假设您要按日期对项目进行排序。现在不是只有一个分区,而是每月有一个分区,即分区键是月份数。现在,如果你想在一个月内对所有的东西进行排序,你可以直接做,但是如果你想得到一个全年的排序列表,你需要Query十二个分区,按顺序,在每个分区中得到一个排序列表一个并将其组合到全年的排序列表中。所谓的时间序列数据库通常采用这种方式建模。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 2010-11-18
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 2015-12-03
      • 1970-01-01
      相关资源
      最近更新 更多