【问题标题】:DynamoDB Query distinct attribute valuesDynamoDB 查询不同的属性值
【发布时间】:2022-01-10 18:36:09
【问题描述】:

我正在尝试查询 DynamoDB 并在 SQL 中获得类似于 select distinct(address) from ... 的结果。

我知道 DynamoDB 是一个面向文档的数据库,也许我需要更改数据结构。

我试图避免先获取所有数据并稍后过滤。

我的数据如下所示:

Attribute Datatype
ID String
Var1 Map
VarN Map
Address String

所以我想获取整个表中的不同地址。

最好的方法是什么?

【问题讨论】:

  • 如果您经常需要此查询,那么您可能需要引入一个包含(唯一)地址、ID 和计数的附加表 AddressCount。在原始表上配置 DynamoDB Streams 并使用 Lambda 函数更新 AddressCount 表,以便在原始表上插入/修改/删除项目时自动插入、递增/递减计数、删除。然后对该表进行简单扫描,至少会为您提供唯一地址。
  • 我将每周执行一次查询,也许两次。我认为这并不多,但是地址的数量每天都在增加。所以我正在考虑你的方法,谢谢

标签: amazon-web-services amazon-dynamodb dynamodb-queries aws-dynamodb


【解决方案1】:

很遗憾,没有。您需要Scan 整个表格(您可以使用ProjectionExpressionAttributesToGet 选项来询问“地址”属性,但无论如何您需要为扫描表格的全部内容付费)。

如果您需要经常进行此扫描,您可以添加一个二级索引,该二级索引项目只有键和“地址”属性,以降低扫描成本。但不幸的是,使用分区键为“地址”的 GSI不会让您能够消除重复项:每个分区仍将包含重复项的列表,并且不幸的是,没有办法只在索引中列出不同的分区键 - Scaning 索引会多次为您提供相同的分区键,因为该分区中有许多项目。

【讨论】:

  • 我不敢确认这一点。您给了我添加第二个索引的想法,以降低成本。我认为的另一种方法是创建一个新表,但是开发一个辅助过程来插入/更新插入和维护辅助表的成本是不值得的。感谢您的帮助
  • 如果您想维护第二张表,请记住处理项目 deletion 的情况 - 您不能只从第二张表中删​​除地址,因为它可能会被使用由另一个项目。您可以做的一件事是在第二个表中的每个地址上保留一个“引用计数”属性,减少它而不是删除地址,并且在扫描第二个表时过滤掉引用计数为 0 的地址。这一切都很容易在 DynamoDB 中做 - 但不是真正的并发安全,因为涉及两个不同的表:-(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 2022-11-10
  • 1970-01-01
  • 2016-03-24
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多