【问题标题】: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
现在我想要两种类型的查询:
- 这会带来与特定
id_number-zip code 和特定foo_id 匹配的所有记录,
但是从最后一个日期开始按created_at 排序记录。 (升序或降序 - 不确定)
- 获取特定
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 范围并降低您的成本。