我无法弄清楚如何在DynamoDB中执行此操作。
我有一个包含这样数据的表:
ID Updated other fields...
1200 2017-12-11 ...
1201 2018-02-05 ...
1205 2018-01-05 ...
1206 2018-01-11 ...
1210 2018-02-15 ...
1212 2018-02-10 ...
分区键是'ID',我的排序键是'Updated'。
我想检索Updated大于“2018-02-01”的记录,比如说。
我无法单独询问'已更新',它会向Query condition missed key schema element: ID
抱怨。我理解这意味着什么,但我不确定如何正确地做到这一点。
我已经尝试添加各种索引,然后查询索引,包括只将'Updated'字段作为分区键,但是我无法查询一系列值,只是在分区键上完全匹配
那么,如何跨多个分区查询条件?
我可以使用扫描,但这可能很昂贵。我可以通过某种方式索引它吗?或者有没有办法做一些类似于查询的事情,我不需要指定分区键?
答案 0 :(得分:3)
几乎所有使用DynamoDB的人似乎都对扫描感到担忧。在许多情况下,扫描都很精细。你应该问自己的事情包括;我将拥有多少数据,它将如何随着时间的推移而增长,我需要多快才能完成扫描,这将花费多少RCU?不要只是解雇扫描 - 做数学。
如果您只需要访问最近的数据,请考虑删除或存档旧数据。通过从表中删除它,您可以提高扫描的性能。
如果您真的想使用查询,可以使用各种策略来提高表性能。例如,您可以使用YYYY-MM的分区键和datetime的排序键(低至纳秒)。这样,您可以在一个查询中检索整个月的数据,同时仍然可以对特定日期范围进行排序。这种查询在您的应用程序中比扫描要复杂得多。构建表格实际上取决于您的数据访问模式。
答案 1 :(得分:2)
•如果不对分区键进行调节,则无法进行查询
•您需要Updated
列作为排序键,可以在表“schema”中,也可以在索引中。如果它不再是排序键,您将无法有效地查询Updated > VALUE
。
因此,您需要一个常量分区键,Updated
作为排序键。这是您的全球二级指数:
•PK:ConstantColumn
•SK:Updated
当然,您将失去一些可伸缩性,因为您的所有索引都在一个分区中,但使用KEYS_ONLY
投影可以为您提供足够的空间。
如果您确实需要更多可扩展性,请考虑使用PK
,C0
,...,C1
之类的Cn
值,迭代查询每个分区键,然后合并结果(除以等)。
答案 2 :(得分:1)
我会考虑替代分区键。例如,如果您创建一个以年为分区键且日期为排序键的GSI,您的业务逻辑是否会起作用?年月怎么样?
您的查询编写起来会更复杂,因为您可能需要发出多个查询以覆盖超过1个分区以填充结果页。
但正如您所指出的,这比执行全表扫描要便宜。