首页 > 解决方案 > 从 DynamoDB 获取记录,有 2 个条件且不使用扫描

问题描述

我需要从 DynamoDB 中获取具有 2 个条件的数据。

示例:条件是 If (isValue==true or xdate < todaysDate)then fetch。我需要在不使用 Scan 的情况下实现这一点。因为扫描需要很多时间。在这种情况下,isValue 是全局二级索引。请让我知道如何根据(isValue==true or xdate < todaysDate). 我正在使用打字稿连接到 DynamoDB。

[P-key] [Sort-key]  [GSI]   
ID          SID    isValue       xdate 
1          234566   TRUE    2021-10-07T10:33:44Z
2          645567   FALSE   2021-10-06T10:33:44Z
3          546688   FALSE   2021-10-07T10:33:44Z
4          545678   TRUE    2021-10-05T10:33:44Z

标签: typescriptamazon-web-servicesamazon-dynamodb

解决方案


有几种方法可以在不使用操作的情况下实现您想要的scan。首先想到的是“稀疏索引”。

您已经在属性上创建了一个全局二级索引 (GSI) isValue,这是一个很好的开始!与其创建一个由字段的值确定该值是否存在的布尔字段,不如考虑isValue仅在为真时才在项目上包含属性isValue

在上面的示例中,这意味着 ID 为 1 和 4 的项目将包含该isValue属性,而 ID 为 2 和 3 的项目将包含该isValue属性。例如:

在此处输入图像描述

DynamoDB 将仅isValue在 GSI 中包含具有该属性的项目,然后您可以根据日期范围查询 GSI。您的 GSI 将如下所示:

在此处输入图像描述

在此示例中,您可能不会使用 的 GSI 分区键isValue,因为true它不是特别引人注目的分区键(可能使用ID项目的 )。但是,此示例旨在说明如何使用 GSI 而不是布尔属性过滤 DynamoDB 中的项目。


推荐阅读