我们目前有一个表,其中分区键和排序键组成主键。
它们都是字符串
的例子:p_id: A# 20121-04-21 (+)s_id: XYZ#2#1634925978 (,,)
我们的一个用例是获取给定分区(regioncode+date)的所有项,但只获取给定id和代码的最新项。
例如我们输入:
A#2021-04-21 , XYZ#2.0#10000 , <other attributes>
A#2021-04-21 , XYZ#2.0#20000 , ...
A#2021-04-21 , QRS#2.0#10000 , ...
我们只想得到
A#2021-04-21 , XYZ#2.0#20000 , ...
A#2021-04-21 , QRS#2.0#10000 , ...
当前,我只是做:
response = self.table.query(
KeyConditionExpression=Key(self.table_key_name).eq(f"{region_id}#{date_key}")
)
然后取出项目,并且必须手动为每个排序键前缀制作映射,直到epoch毫秒/时间戳。然后,对于每个键,仅当时间戳比之前的时间戳更新时才设置该值。
是否有一种方法可以更快地做到这一点,并更多地利用查询本身?我考虑过是否要将ID中的片段添加为属性或许可以使用某种过滤但我认为没有任何东西可以让我做类似于"分组"的事情;就像我想要的那样。难道我别无选择,只能创建某种索引吗?
任何想法?帮助将非常感激!
DDB不支持聚合,MIN/MAX/COUNT/SUM/,就像RDBMS一样…
一个解决方案是使用"触发器"DDB Streams + lambda来为您聚合所需的数据。参见为物化聚合查询使用全局二级索引
您可能还需要考虑使用各种方法来实现DDB数据的版本控制。
如果您想获得最新的项,那么您的Sort Key应该以ISO8601标准格式日期结束,该日期在添加项时确定。然后可以执行Query,因为排序键以iso8601标准日期结束,所以返回的第一个项自动是添加的最后一个项。(ISO8601日期格式为'字母顺序'和排序键是…自动排序。(如果你告诉它以相反的方向排序,那么返回的第一个项目是自动…第一项!)
您将需要执行类似SK: SOME_QUALIFIER#YYYY-mm-ddTHH:MM:SSZ00:00
-的操作,然后使用SKbegins with "SOME_QUALIFIER#"
执行查询。-所以你必须考虑你想要如何组织它,但是利用排序键自动排序的事实是完全有可能的。
或者,如果你只是偶尔会这样做(即生成报告或者说)可以把你的最后更新日期(或最后创建,更重要的是)在自己的属性(和composoite类型钥匙你要经常不管怎样! !),然后创建一个索引,作为你的排序关键字,和别的东西(报告类型之类的)的PK。然后你可以查询PK和获得最新的项目
MIN/MAX和许多其他sql风格的调用可以通过巧妙地使用sort键来欺骗。