Java 获取每个分区键的最新/max

Java 获取每个分区键的最新/max,java,amazon-web-services,amazon-dynamodb,Java,Amazon Web Services,Amazon Dynamodb,这个表非常简单,它是一个包含组件列表的包,包名作为分区键,版本作为排序键 正如标题所示,我需要获得每个软件包的最新版本,但我无法解决如何以最佳/最有效的方式实现这一点 我曾想过使用日期时间戳作为排序键(version)或GSI以及版本号,但我所能看到的最好结果是,您必须重复查询表中返回有序列表的每个分区 我还考虑了使用第二个表存储此信息的可能性 对如何最好地解决这一问题的其他意见感兴趣。任何关于如何使用SpringDataDynamo/Java的提示都将非常有用。一个可能的解决方案是一个。基本上

这个表非常简单,它是一个包含组件列表的包,包名作为分区键,版本作为排序键

正如标题所示,我需要获得每个软件包的最新版本,但我无法解决如何以最佳/最有效的方式实现这一点

我曾想过使用日期时间戳作为排序键(version)或GSI以及版本号,但我所能看到的最好结果是,您必须重复查询表中返回有序列表的每个分区

我还考虑了使用第二个表存储此信息的可能性


对如何最好地解决这一问题的其他意见感兴趣。任何关于如何使用SpringDataDynamo/Java的提示都将非常有用。

一个可能的解决方案是一个。基本上,您可以创建一个属性,如
isLatestVersion
,该属性要么为
true
,要么该项没有该属性。然后,您可以使用该属性创建一个GSI作为分区键或排序键。只有具有该属性的项目才会出现在GSI中,因此您可以非常快速地扫描GSI。或者,如果您使用
isLatestVersion
作为GSI的分区键,那么您可以非常轻松地查询GSI(例如,获取以“Foo”开头的所有包的最新版本可能会很有用……但我不知道您的其他用例)

这是陷阱。您需要确保在添加新版本时,从以前的最新版本中删除该属性。这是很容易做到使用和lambda功能,或者你可以用来添加新的包版本到您的表同时删除旧版本的属性,但你需要仔细考虑所有情况下,最新版本可以改变。
无论哪种方式,您都需要设计应用程序代码,以过滤掉包中偶尔出现的重复条目。(GSI最终是一致的,因此在更新最新版本后有一个非常短的时间窗口(通常为几毫秒),如果查询最新的包版本,可能会得到两个最新版本。)

目前正在尝试让它与稀疏索引一起工作,看起来应该可以做到这一点。虽然目前spring数据总是试图在IslatesVersion的GSI上扫描而不是查询。这就是我所需要的!稀疏索引是如此容易忘记!