如何从 Dynamo DB 获取最近的条目

问题描述 投票:0回答:1

我们在Dynamo DB中有一个表,要保存的属性如下。

  • ProcessId - 将其保留为分区键,每个条目都是唯一的
  • CreatedDate(插入时间)
  • 文件名
  • 其他随机属性

我们正在使用 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吗?

amazon-web-services amazon-dynamodb aws-api-gateway vtl
1个回答
0
投票

为此,我会为您的项目添加一个值(假设您的写入吞吐量不超过每秒 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
}

有关此博客文章的更多信息

© www.soinside.com 2019 - 2024. All rights reserved.