【问题标题】:dynamodb is it possible to query on composite partition key and composite sort keydynamodb 是否可以查询复合分区键和复合排序键
【发布时间】:2020-07-07 21:34:14
【问题描述】:

假设您有带有键的表:
partition key(复合字符串连接):id_number-zip_code
sort key(复合字符串连接):foo_id-created_at

以及其他一些表属性:
details1: String
details2: String

现在我想要两种类型的查询:

  1. 这会带来与特定id_number-zip code 和特定foo_id 匹配的所有记录, 但是从最后一个日期开始按created_at 排序记录。 (升序或降序 - 不确定)
  2. 获取特定 id_number-zip code 的所有记录,但记录仅在上个月的 1 到 5 字符串值和 created_at 之间的 foo_id 范围内。

在给定当前按键设计的情况下,是否可以在 dynamo 中进行此类查询?
如果可能,请举一些例子(使用boto3)

【问题讨论】:

    标签: python-3.x amazon-dynamodb boto3 dynamodb-queries


    【解决方案1】:

    使用Query 请求(boto3 的query() 方法)可以有效地完成第一类查询。您可以将指定特定分区键的KeyConditionExpression 以及排序键的begins_with 条件传递给查询。例如:

        table.query(KeyConditionExpression='p=:p AND begins_with(s, :s)',
                    ExpressionAttributeValues={':p': 'id-zip', ':s': 'foo_id-'})
    

    (这只是伪代码,您实际上需要使用分页来获取可能的许多查询结果,我将留给您弄清楚细节,它们记录在 boto3 文档和示例中)。

    这种类型的查询将非常有效 - DynamoDB 可以准确找到必要的项目,而无需检查(或向您收费)任何其他项目。

    第二种查询也是可能的,但效率较低。在KeyConditionExpression 中,您可以指定foo_id 范围,使用语法s BETWEEN :s1 AND :s2 而不是上面的begins_with(s, :s)。但是 DynamoDB 没有有效的方法来实现您对 created_at 的第二个要求。您需要使用 FilterExpression 来执行此操作,但您应该知道 DynamoDB 需要读取(并且您需要付费)foo_id 范围内的所有项目,无论它们的 created_at .

    或者,如果在您的示例中您真的只需要匹配几个 foo_id 值(例如,1、2、3、4、5),那么将您的查询作为 5 个不同的查询可能会更有效.如果您这样做,每个查询可以使用KeyConditionExpression(而不是FilterExpression)匹配created_at 范围并降低您的成本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-27
      • 1970-01-01
      • 2014-07-27
      • 2019-05-19
      相关资源
      最近更新 更多