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

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

  1. 这会带来与特定 id_number-zip code 和特定 foo_id 匹配的所有记录, 但记录从最后日期开始按 created_at 排序。 (升序或降序- 不确定)
  2. 获取特定 id_number-zip code 的所有记录,但记录恰好在 15 字符串值和 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 范围并降低成本。