当前位置: 首页 > 知识库问答 >
问题:

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

桂德义
2023-03-14

我有一个dynamodb表,用于存储在我的服务器上运行的进程的历史运行数据,我需要一个可以聚合这些进程并查看每个进程的最新数据的位置。每个进程都有自己的ProcessId,它是dynamodb表的分区键。排序键是开始时间

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

本质上,我需要为我提供的每个ProcessId检索最新的StartDateTime。我在aws sdk中使用nodejs lambda来检索数据。我已经研究过使用BatchGetItem,但我的理解是,对于具有分区键和排序键的表,您需要提供这两个键来检索项。我还研究了使用查询,但我需要为每个不理想的分区运行单独的查询。有人知道我可以在一次调用中发出此请求,而不必在每个分区中单独调用吗?

共有2个答案

全飞扬
2023-03-14

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

与其运行昂贵的查询或扫描,不如尝试在表上启用DynamoDB流,并使用另一个lambda在另一个DynamoDB表中以processId作为分区键“upsert”开始时间。

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

归俊杰
2023-03-14

为了总结我从您的帖子中了解到的内容,您的表格中可能有如下数据:

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

您需要轻松检索:

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

正如sandboxbohimian所说,我建议您使用一个流来在每次新输入到达时触发lambda函数。但是,我会使用相同的表并向上插入具有相同id和时间戳等于0的项目。此外,我添加了一个二进制属性“最新”,始终设置为“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等于“latest”,SK等于“timestamp”,项目的“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进行查询,并利用有关timestam2的排序功能。

我同意这个模式不是直观的,但这种情况经常发生在Dynamodb上

 类似资料:
  • 假设我有一个带有分区键“ID”和范围键“Time”的表,其中包含以下项目: 我只想扫描每个分区中时间值最高的一个项目。所以扫描的结果应该如下所示: DynamoDB的扫描功能是否可能做到这一点?(我想避免全部扫描,自己过滤)。

  • 我有一个带有分区键(UUID)的DynamoDB表,其中有几个属性(如名称、电子邮件、创建日期等)。创建日期是项目中的一个属性,其格式为YYYY-MM-DD。但现在有一个要求更改-我必须根据创建日期对其进行排序,并提供整个数据(也就是说,我不能只将数据放在某个特定分区上,而是以排序方式将所有分区中的所有数据都放在一起。我知道这可能需要DynamoDB花费时间从所有分区中提取数据并在之后进行排序。我

  • 我试图使用batchGetItem从表中返回多个项的属性,但似乎它只适用于分区键和范围键的组合,但是如果我只想通过主键识别请求的项,该怎么办?唯一的方法是创建不带范围键的表吗? 根据官方留档: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.Partitions.html 如果表有一个复合主键(分

  • 我试图查询具有分区键和排序键的表(但是分区键和排序键是1:1,我只想使用分区键[仅返回一项]进行查询)。 这是我尝试过的代码,但没有成功(testId是分区键名,1234567890是字符串形式的分区键值);你们都知道我可以只使用分区键进行查询的方法吗?记住,由于分区键和排序键是1:1,所以只会返回一个项?提前非常感谢您。[这是我的第一篇堆栈溢出帖子-很抱歉,如果我用词不当,我很乐意回答关于我的措

  • 假设我有一个名为“student_course”的Dynamo DB表。我想存储每个学生在大学学习的课程。一个学生可以一次学习多个课程,一个课程可以一次有多个学生。所以基本上它是一个多映射。 我的数据访问模式只有一个用例- 一次获取一个学生和一门课程的记录,即获取每个学生ID和CourseId组合的数据。它保证对于学生ID和课程ID组合,只有一条记录可用。 为了实现这一点,我可以通过以下两种方式存

  • 与主键、复合键和候选键相比,dynamodb中的分区键和排序键是什么?