【问题标题】:dynamoDB: How to query N elements starting at X indexdynamoDB:如何从 X 索引开始查询 N 个元素
【发布时间】:2019-08-29 02:22:22
【问题描述】:

我正在寻找使用 python3 的代码示例,没有指向文档的链接。我没有在文档中找到示例。

我希望查询从 ID 1 开始的类别为“红色”的 2 个元素。

这是我的桌子:

| ID | category | description |
| 0  | red      | ....        |
| 1  | red      | ....        |
| 2  | blue     | ....        |
| 3  | red      | ....        |
| 4  | red      | ....        |

查询应返回 id 为 1 和 3 的元素。

期待阅读您的示例。提前致谢。

【问题讨论】:

    标签: python-3.x amazon-web-services amazon-dynamodb dynamodb-queries


    【解决方案1】:

    在 dynamo Db 中,您可以查询您的 PartitionKey、LSI 或 GS​​I。

    在您的情况下,我将创建一个 GSI,将其 partitionKey (gsiID) 作为您的类别,并将其 sortKey (gsiSK) 作为您的 ID。

    在这种情况下,您可以执行如下查询:查询 gsiID = red 和 gsiSK = * 的所有元素

    这将为您提供所有按其 ID 升序排序的红色(您也可以指定降序)

    现在 dynamo 查询可以选择限制您的结果。既然你需要,你可以做一个限制= 2。

    希望对你有帮助!

    【讨论】:

      【解决方案2】:

      您需要定义一个全局二级索引,其中分区键为category,排序键为id

      一旦定义了该索引,就可以按如下方式查询它(我使用的是 JS 表示法,抱歉):

      {
        TableName: 'your_table_name',
        IndexName: 'your_index_name',
        KeyConditionExpression: 'category = :x and ID >= :y',
        ExpressionAttributeValues: {
          ':x': 'red',
          ':y': 1
        }
      }
      

      请注意,这是一个查询。在 DynamoDB 中,查询处理项目的“块”(又名:“页面”)。具体来说,在执行查询时,DDB 获取一个块,在该块中找到所有匹配项并返回它们。如果其他块中还有其他匹配项,则不会返回。但是,响应将为您提供下一个块的详细信息,以便您可以对下一个块发出后续查询。这些“细节”封装在响应的LastEvaluatedKey字段中,应该复制到后续请求的ExclusiveStartKey中。

      您可以查看此guide 以查看使用LastEvaluatedKey 的示例。查找以下行:

      while 'LastEvaluatedKey' in response:
      

      重要!

      虽然您只想获取两个项目,但您不想将Limit 字段设置为2。将其设置为 2 意味着 DynamoDB 在查找与您的查询匹配的项目时将使用非常小的块(实际上,它将使用只有两个项目的块):这意味着您将需要执行大量重复查询(通过使用 @ 987654332@/ExclusiveStartKey 如上所述),直到您真正找到两个匹配项。这将大大减慢整个过程。对于大多数实际场景,最好的做法是根本不设置Limit字段,直接使用默认值即可。

      【讨论】: