dynamodb 是否可以查询复合分区键和复合排序键
dynamodb is it possible to query on composite partition key and composite sort key
假设您有 table 键:
partition key
(复合字符串连接):id_number-zip_code
sort key
(复合字符串连接):foo_id-created_at
和其他一些 table 属性:
details1: String
details2: String
现在我想有两种类型的查询:
- 这会带来与特定
id_number-zip code
和特定 foo_id
匹配的所有记录,
但记录从最后日期开始按 created_at
排序。 (升序或降序- 不确定)
- 获取特定
id_number-zip code
的所有记录,但记录恰好在 1
到 5
字符串值和 created_at 之间的 foo_id
范围内仅在上个月。
在给定当前键设计的情况下,是否可以在 dynamo 中执行此类查询?
如果可能请举一些例子(使用boto3
)
第一种查询可以通过 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
范围并降低成本。
假设您有 table 键:
partition key
(复合字符串连接):id_number-zip_code
sort key
(复合字符串连接):foo_id-created_at
和其他一些 table 属性:
details1: String
details2: String
现在我想有两种类型的查询:
- 这会带来与特定
id_number-zip code
和特定foo_id
匹配的所有记录, 但记录从最后日期开始按created_at
排序。 (升序或降序- 不确定) - 获取特定
id_number-zip code
的所有记录,但记录恰好在1
到5
字符串值和 created_at 之间的foo_id
范围内仅在上个月。
在给定当前键设计的情况下,是否可以在 dynamo 中执行此类查询?
如果可能请举一些例子(使用boto3
)
第一种查询可以通过 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
范围并降低成本。