如何按单列对 DynamoDB table 进行排序?

How to sort DynamoDB table by a single column?

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

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

谢谢!

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

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

If ScanIndexForward is true, DynamoDB returns the results in the order in which they are stored (by sort key value). This is the default behavior. If ScanIndexForward is false, DynamoDB reads the results in reverse order by sort key value, and then returns the results to the client.

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

UI 也有复选框:

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

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

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

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