Amazon dynamodb 如何使用GSI查询DynamoDB中的2个以上属性?

Amazon dynamodb 如何使用GSI查询DynamoDB中的2个以上属性?,amazon-dynamodb,dynamodb-queries,amazon-dynamodb-index,Amazon Dynamodb,Dynamodb Queries,Amazon Dynamodb Index,我有一个用例,需要查询dynamoDB表上的两个以上属性。据我所知,我们只能使用GSI在DDB表上查询多达2个属性(分区键、排序键)。是否有任何东西允许我们使用GSI查询多个属性(如invoiceId、clientId、invoiceStatus)。是的,这是可能的,但在设计表时需要考虑您想要支持的每个访问模式 这个话题已经在re:Invent上讨论过多次。这是几年前的一段视频,但每年都有类似的关于这个话题的演讲 两个主要选项是使用组合键或查询过滤器 复合键功能非常强大,可以归结为生成新的“合成

我有一个用例,需要查询dynamoDB表上的两个以上属性。据我所知,我们只能使用GSI在DDB表上查询多达2个属性(分区键、排序键)。是否有任何东西允许我们使用GSI查询多个属性(如invoiceId、clientId、invoiceStatus)。

是的,这是可能的,但在设计表时需要考虑您想要支持的每个访问模式

这个话题已经在re:Invent上讨论过多次。这是几年前的一段视频,但每年都有类似的关于这个话题的演讲

两个主要选项是使用组合键或查询过滤器

复合键功能非常强大,可以归结为生成新的“合成”键,这些键可以简单地连接记录中的其他字段,然后在GSI中使用这些字段

例如,如果您有一个客户机,您希望能够获取其所有未结发票,但也希望能够获取单个发票,则可以使用clientId作为分区键,并将invoiceStatus和invoiceId连接在一起作为排序键。然后,您可以使用begins_with仅返回某些发票状态。在本例中,您需要知道invoiceStatus和invoiceId,这不是最好的示例

复合键模式对于日期也很有用,因为您可以使用大于或小于来搜索特定的时间范围。但是,也可以通过连接直接获取记录

另一种设计是使用查询过滤器。这效率较低,因为DynamoDB必须扫描与分区和排序键匹配的所有记录。但是,过滤器可以应用于任何属性,并减少从DynamoDB传输到应用程序的数据量。当您的主键大部分是选择性的,但可能存在多个匹配项时,这非常有用,并且过滤器会让您完成剩下的工作


使用GSI有助于降低成本的另一个方面是只投影您关心的属性。更新记录时,GSI仅在其中一个投影属性更新时更新。通过保持GSI的精简,可以使前面列出的策略更具成本效益。

是的,这是可能的,但在设计表时需要考虑到您想要支持的每种访问模式

这个话题已经在re:Invent上讨论过多次。这是几年前的一段视频,但每年都有类似的关于这个话题的演讲

两个主要选项是使用组合键或查询过滤器

复合键功能非常强大,可以归结为生成新的“合成”键,这些键可以简单地连接记录中的其他字段,然后在GSI中使用这些字段

例如,如果您有一个客户机,您希望能够获取其所有未结发票,但也希望能够获取单个发票,则可以使用clientId作为分区键,并将invoiceStatus和invoiceId连接在一起作为排序键。然后,您可以使用begins_with仅返回某些发票状态。在本例中,您需要知道invoiceStatus和invoiceId,这不是最好的示例

复合键模式对于日期也很有用,因为您可以使用大于或小于来搜索特定的时间范围。但是,也可以通过连接直接获取记录

另一种设计是使用查询过滤器。这效率较低,因为DynamoDB必须扫描与分区和排序键匹配的所有记录。但是,过滤器可以应用于任何属性,并减少从DynamoDB传输到应用程序的数据量。当您的主键大部分是选择性的,但可能存在多个匹配项时,这非常有用,并且过滤器会让您完成剩下的工作

使用GSI有助于降低成本的另一个方面是只投影您关心的属性。更新记录时,GSI仅在其中一个投影属性更新时更新。通过保持GSI的精简,使先前列出的策略更具成本效益