【问题标题】:How to query: filtering on multiple primary partition keys and range on primary sort key如何查询:过滤多个主分区键和主排序键范围
【发布时间】:2016-06-06 14:38:30
【问题描述】:

背景 我有一个 dynamoDB 表,其中包含一个主分区键 clientID ("N") 和一个主排序键 createdAt("S") (作为 UTC ISO 8601 日期)+ 一些附加属性。

问题 我想查询 createdAt BETWEEN 两个日期的所有项目,并且一次只能查询大约 100 个特定的 clientIDs。

  • 死胡同 1: 首先我考虑过使用BatchGetItem,但是虽然我知道clientIDs 我想查询什么,但我无法指定排序键,因为我正在寻找任何东西,即发生在一个时间范围内。
  • Dead end 2:其次,我想使用Query,但是它不允许我同时查找多个clientIDs(在查看“IN”运算符时,@ 987654323@)。换句话说,我怎样才能做到这一点,而不必在时间范围内为每个ClientID 做一个Query

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb


    【解决方案1】:

    我最终做了别的事情:

    我添加了一个名为index_date 的新属性,它只包含created_at 的日期部分(不是时间)。然后我在这个属性上添加了一个新的二级全局索引,created_at 作为排序键。通过这种方式,我可以一次有效地查询一天(如果我愿意,可以在特定时间范围内)的所有项目。然后处理它们。

    【讨论】:

      【解决方案2】:

      您提到的两个选项实际上是您唯一的选项。

      • 选项 1:对所需的 clientID 使用 BatchGetItem,然后对 createdAt 进行应用程序端过滤。
      • 选项 2:为每个 clientIDcreatedAt 范围触发 1 个查询,然后在应用程序端合并数据。

      您需要根据您的访问模式、表结构和成本因素选择两者之一。

      例如,如果每个 clientID 的平均 createdAt 数量不高,选项 1 就足够了,因为它在读取容量单位上也很节省。

      编辑:正如 Niels 在此答案的评论中指出的那样,选项 1 在这种特定情况下不起作用,因为 BatchGetItem 需要分区键和排序键。

      【讨论】:

      • 嗯,我看不出选项一是如何工作的。在文档中它说:“Keys - 定义表中特定项目的主键属性值数组。对于每个主键,您必须提供所有键属性。例如,使用简单的主键,您只需要提供分区键值。对于复合键,您必须同时提供分区键值和排序键值。” 所以在我的情况下,我事先不知道createdAt ,那我就不可能批量获取...
      • 你是对的。我已经确定了我的答案。所以,看起来你被 Query 困住了。
      猜你喜欢
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      相关资源
      最近更新 更多