我们在Dynamo DB中有一个表,要保存的属性如下。
我们正在使用 API 网关并将其直接与 Dynamo DB 集成。 我们希望得到过滤后最新的N条记录。
我们考虑使用限制为N的扫描,但这不起作用,因为“限制”限制了过滤之前的扫描,并给我们带来不一致的结果。 我们已在 CreatedDate 创建 GSI,以便以下发布请求能够正常工作。
{
"TableName": "<TABLE NAME>",
"Limit": $input.params('pageSize'),
"FilterExpression": "CreatedDate > :v1",
"ExpressionAttributeValues": {
":v1": {"S": "2024-05-03T06:32:22"}
},
"ReturnConsumedCapacity": "TOTAL",
}
我们还想按照 CreatedDate 的降序对结果集进行排序,最新的在前。
你觉得可能吗,如果不可能的话需要考虑换DB吗?
为此,我会为您的项目添加一个值(假设您的写入吞吐量不超过每秒 1000WCU)。
进程ID | 创建日期 | 文件名 | GSI1PK | 随机 |
---|---|---|---|---|
123 | 2024-03-02T20:00:000Z | 我的文件100 | 1 | 一些价值观 |
001 | 2024-02-01T20:00:000Z | 我的文件202 | 1 | 一些价值观 |
928 | 2024-03-04T20:00:000Z | 我的文件412 | 1 | 一些价值观 |
102 | 2024-04-05T20:00:000Z | 我的文件339 | 1 | 一些价值观 |
现在您在
GSI1PK
上创建索引作为分区键,并在 CreatedDate
上创建索引作为排序键:
GSI1PK | 创建日期 | 文件名 | 进程ID | 随机 |
---|---|---|---|---|
1 | 2024-02-01T20:00:000Z | 我的文件202 | 001 | 一些价值观 |
1 | 2024-03-02T20:00:000Z | 我的文件100 | 123 | 一些价值观 |
1 | 2024-03-04T20:00:000Z | 我的文件412 | 928 | 一些价值观 |
1 | 2024-04-05T20:00:000Z | 我的文件339 | 102 | 一些价值观 |
请注意您的所有项目现在如何按
CreatedDate
的升序存储。现在您发出 Query
并拥有 ScanIndexForward=False
,它将首先读取最新项目 (DESC)。
{
"TableName": "<TABLE NAME>",
"IndexName": <INDEX NAME>",
"Limit": $input.params('pageSize'),
"KeyConditionExpression": "GSI1PK = :v1",
"ExpressionAttributeValues": {
":v1": {"S": "1"}
},
"ReturnConsumedCapacity": "TOTAL",
"ScanIndexForward": False
}
有关此博客文章的更多信息