DynamoDb:如何检索每个给定分区键列表的第一项(按排序键)



我有一个 dynamodb 表,用于存储在我的服务器上运行的进程的历史运行数据,我需要一个地方来聚合这些进程并查看每个进程的最新数据。每个进程都有自己的ProcessId这是 dynamodb 表的分区键。排序键是StartDateTime

{
ProcessId, // Partition Key
StartDateTime, // Sort Key
... // More data
}

本质上,我需要为我给出的每个进程 ID 检索最新的 StartDateTime。我正在使用带有aws-sdk的nodejs lambda来检索数据。我已经研究过使用 BatchGetItem 的问题,但我的理解是,对于具有分区键和排序键的表,您需要同时提供两者才能检索项目。我也考虑过使用查询,但我需要为每个小于理想的分区运行一个单独的查询。有谁知道我可以在一次调用中发出此请求的方法,而不必为每个分区进行单独的调用?

总结一下我从您的帖子中了解到的内容,您的表中可能有这样的数据:

PK (id)         SK (timestamp)    Other data
process1        1                 ...
process2        4                 ...
process1        8                 ...
process3        18                ...
process2        25                ...

您需要轻松检索:

process1        8                 ...
process2        25                ...
process3        18                ...

正如沙盒波西米亚所说,我建议您使用一个流,以便在每次新输入到达时触发 lambda 函数。但是,我会使用相同的表并更新具有相同 id 且时间戳等于 0 的项目。此外,我添加一个二进制属性"latest",始终设置为"True",并为当前时间戳添加一个数字属性。 按时间顺序,条目将是:

PK (id)         SK (timestamp)    Other data      timestamp2(GSI SK)  latest (GSI PK)
process1        1                 ...                      
process1        0                 ...             1                   true
process2        4                 ...                      
process2        0                 ...             4                   true
process1        8                 ...                      
process1        0                 ...             8        
process3        18                ...                      
process3        0                 ...             18                  true       
process2        25                ...                      
process2        0                 ...             25                  true       

然后,您必须创建一个 GSI,PK 等于"最新",SK 等于"时间戳",并投影"id"和"data"属性。它将是一个稀疏索引,这意味着只会存在填充了最新属性的项目。以下是内容:

latest (GSI PK) timestamp2 (GSI SK)   id        timestamp   Data
true            8                     process1  0           ...
true            25                    process2  0           ...    
true            18                    process3  0           ...   

如您所见,PK 始终具有相同的值。因此,它允许执行查询或扫描。如果您需要所有最后的过程,您可以进行扫描。如果进程数确实很高,则可以使用 latest=True 进行查询,并利用有关 timestamp2 的排序功能。

我同意这种模式并不直观,但 dynamodb 经常出现这种情况

您似乎正在尝试某种聚合,而 DynamoDB 通常不是最适合聚合,而是更适合 CRUD 风格的操作。

尝试在表上启用DynamoDB Streams,并使用另一个 lambda 在另一个 DynamoDB 表中"更新"开始时间,并将 processId 作为分区键,而不是运行昂贵的查询或扫描。

然后,您可以在此新表上的 processId 上运行最新开始时间的查询。

最新更新