【问题标题】:DynamoDB - Extract date and QueryDynamoDB - 提取日期和查询
【发布时间】:2021-09-05 16:41:42
【问题描述】:

我的 DynamoDB 中有下表。 我想使用以下条件或过滤器获取/提取所有数据

  • 本月数据:这将是属于本月 1 日到今天的记录集。 (我认为这可以使用BEGINS_WITH 过滤器来实现,再次不确定这是否是正确的方法)
  • 本季度数据:这将是属于本季度的记录集,基本上是从 2021 年 4 月 1 日到 2021 年 6 月 30 日
  • 今年数据:这将是属于这一整年的记录集

问题:如何使用上表中的date 列过滤/查询数据以获取这3 种类型(月、季度、年)的数据。

其他详情

  • 表大小:25 GB

  • 项目数:4,081,678

【问题讨论】:

  • 列中最多有 5 个分量:date1-date2|x|y|z。你到底用什么来判断一行是否少于 30 天?
  • 基本上我想将 date1-date2 转换为范围过滤器,这样我就可以查询日期范围了。
  • 您将无法使用 DynamoDB API 从任意属性中“提取”日期。如果uuid 是您的排序键(又名范围键),您就可以使用between 关键字来比较日期。如果不了解表和主键是如何设置的,真的很难说应该做什么。
  • @SethGeoghegan 我已经用更多细节编辑了整个问题

标签: amazon-dynamodb dynamodb-queries


【解决方案1】:

您似乎具有基于时间的访问模式(例如按月、季度、年等获取)。

由于您的排序键以日期开头,因此您可以在排序键上使用between 条件来实现您的访问模式。例如(在伪代码中):

获取本月用户 1 的数据

查询其中 user_id = 1 和 2021-06-01 和 2021-06-30 之间的日期

获取本季度的用户 1 数据

查询其中 user_id = 1 和 2021-01-01 和 2021-03-31 之间的日期

获取本月用户 1 的数据

查询其中 user_id = 1 和 2021-06-01 和 2021-06-30 之间的日期

如果您需要跨所有用户获取,您可以使用scan 操作使用相同的方法。虽然scan 通常被认为是浪费/低效,但如果您不经常运行此类查询,这是一种很好的方法。

但是,如果这是一种常见的访问模式,您可能需要考虑重新组织数据以提高此操作的效率。

【讨论】:

  • 感谢您的投入,您是对的,这个设计是不正确的。我对流程做了一些更改(表格设计、Lambda 等),我在答案中发布了详细信息。希望它会帮助别人。
【解决方案2】:

正如 @Seth Geoghegan 在上面的回答中提到的那样,上面的表格设计不正确,理想情况下,您应该在放置 Partition KeySort Key 之前考虑一下,仍然适合像我这样的人已经有这种情况的人,这是我为缓解问题而采取的步骤。

  • 启用 DynamoDB Steams
  • 重新触发数据,以便它们可以通过 DDB 流(我使用其中一个脚本在我的所有记录中添加了一个额外的列 updated_dttm
  • 处理 Streams 记录,在我的例子中,我将上面的 date 列分解为另外三个列,event_datecategorysub_category,并使用 Lambda 更新回原始记录

然后我可以使用event_date 列查询我的数据,我还可以在event_date 列上创建索引并使我的查询/搜索更有效

需要考虑的要点

  • 更新记录以便它们可以转到 DDB 流的成本
  • 重新处理记录的成本
  • 将记录更新回 DDB 的成本

【讨论】:

    猜你喜欢
    • 2020-09-21
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多