查询DynamoDB中每个ID的最新记录

时间:2020-04-16 11:00:00

标签: amazon-dynamodb

我们有一个这样的表:

user_id | video_id | timestamp
      1          2           3
      1          3           4
      1          3           5
      2          1           1

我们需要查询最新时间戳以查询特定用户观看的每个视频。

当前已完成以下操作:

response = self.history_table.query(
            KeyConditionExpression=Key('user_id').eq(int(user_id)),
            IndexName='WatchHistoryByTimestamp',
            ScanIndexForward=False,
        )

它查询指定用户的所有视频的所有时间戳,但是这样做确实给数据库带来了巨大的负担,因为可能有成千上万个视频的数千个时间戳。

我试图在Internet上找到解决方案,但是正如我所看到的,所有SQL解决方案都使用GROUP BY,但是DynamoDB没有此类功能

1 个答案:

答案 0 :(得分:1)

我知道有两种方法可以做到这一点:

方法1 GSI全球二级指数

GroupBy有点像DynamoDB中的分区(但不是真的)。我假设您的分区当前为user_id,但是您希望video_id作为分区键,而timestamp作为排序键。您可以创建一个新的GSI,然后指定新的排序键timestamp和分区键video_id。这使您能够查询给定的视频,最新的时间戳,因为此查询仅使用1个RCU,并且只需添加--max-items 1 --page-size 1即可超快。但是您需要提供video_id

方法2稀疏索引

1 的问题是您需要提供一个ID,而您可能只想获取具有最新时间戳的视频列表。有两种方法可以执行此操作,我喜欢的一种方法是使用稀疏索引,如果您有一个名为latest的属性,并且对于最新的timestamp将该属性设置为true,则可以创建一个GSI并选择该属性键latest,但您不必自己手动设置和取消设置此值,而必须在lambda流或应用程序中进行此操作。

这看起来确实很奇怪,但这是NoSQL与SQL相对的工作方式,我本人现在正在与当前项目进行斗争,在SQL中,我每次必须这样做时都必须自己使用其中的一些技术,感觉不对,但希望我们会习惯。