【问题标题】:Fetch record from DynamoDB with 2 conditions and without using scan从 DynamoDB 获取记录,有 2 个条件且不使用扫描
【发布时间】:2021-10-08 22:20:41
【问题描述】:

我需要从 DynamoDB 获取数据,有 2 个条件。

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

【问题讨论】:

  • 请向我们展示表格和按键布局以及一些示例数据。
  • xdate 是排序键吗?
  • No isValue 是 GSI,xdate 是正常属性。我对分区键和排序键有不同的属性。但在这种特殊情况下,我只需要基于 (isValue==true 或 xdate
  • 那么你不能在没有扫描的情况下进行查询。

标签: typescript amazon-web-services amazon-dynamodb


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 虽然这很有用,但它不能回答 OP 的问题。
  • 我没有看到 OP 提出的具体问题,所以我不得不做一些解释。听起来问题是“如何在不使用扫描操作的情况下使用非主键属性上的过滤器从 DynamoDb 获取数据?”。答案有点微妙,但我想我已经概述了一种实现 OP 想要的策略。如果不清楚我的答案如何解决 OP 的问题,我愿意接受有关如何改进答案的建议。
  • 在我看来,答案是——不可能使用查询,因为必须将分区键名称和值指定为相等条件。使用您在答案中提到的稀疏索引策略,当 isValue 为 FALSE 但 xdate 小于 todaysDate 时,OP 的条件要求将不被满足:)
  • 访问模式是“获取 isValue 为 TRUE 且 xdate 为
  • 这是问题中的or 条件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多