在 DynamoDB 中为日期比较设置索引

Setting up indexes for date comparison in DynamoDB

如何在 DynamoDB table 上设置索引以比较日期?即,例如,我的 table 中有一个名为 synchronizedAt 的列,我希望我的查询获取所有从未同步过(即 0)或在过去 2 周内未同步过的行,即(新日期( .getTime()) - (1000 * 60 * 60 * 24 * 7 * 4)

这取决于你table的其他属性。

如果Hash值集合比较小,stable,可以使用Hash和Range Primary Key;在这种情况下,您可以通过将日期放在范围内来过滤日期,但是 无论如何,查询也将通过指定索引来完成,因此它可能有意义也可能没有意义预查询所有索引值以执行一个循环,其中询问有趣的范围(在每个索引值的循环内)。

替代方案可以是 哈希和范围 GSI。在这种情况下,您可以将固定的哑值作为索引,以便一次查询所有项目的范围。

最后,Scan 效率较低,但是 tables 较大时会出现问题(table 越大,Scan 完成所需的时间越长)。

我有类似的查询日期范围的要求。在我的例子中,日期范围只是标准。 DynamoDB 的问题是您无法使用 Just Range 键创建索引。它总是需要 Hashkey 并且在这样的索引上查询总是期望等于 Hashkey 的条件。

所以我欺骗了数据库。我创建了一个 Key 作为 Century 并填充了日期的世纪年份。例如 2019 年 1 月 1 日,世纪键值是 20。对于 2020 年 1 月 1 日,世纪键值也是 20。很容易从任何日期导出。然后使用 Hashkey 作为 Century 和 RangeKey 作为日期创建 GSI。在查询时,很容易从日期范围导出世纪并将查询条件 Hashkey 构建为世纪和日期范围。由于我处理数据的时间不超过 5 年,因此在接下来的 75 年内,技巧都不会失败。 :)

它不是那么“好”的解决方法,但对我来说效果很好。也许它也会帮助其他人。