【问题标题】:Support for queries across documents in DynamoDB支持 DynamoDB 中的跨文档查询
【发布时间】:2017-06-20 10:37:20
【问题描述】:

我一直在评估将我们的数据存储从 MongoDB 迁移到 DynamoDB,因为它是一项完善的 AWS 服务。

但是,我不确定 DynamoDB 数据模型是否足够强大以支持我们的用例。我知道 DynamoDB 在 2014 年增加了文档支持,但无论我看到什么例子,看起来都不是解决跨文档工作的查询,也没有为分区键指定值。

例如,如果我有一份包含员工信息的文档, { “名称”:“约翰·多伊”, “部门”:“销售”, “加入日期”:“2017-01-21” }

我需要进行查询,比如给我所有在 01-01-2016 之后加入的员工,然后我无法使用此架构。 在创建具有随机生成的分区键(例如 0-99)的二级索引并在“date_of_joining”上创建排序键,然后查询所有分区并将条件放在“date_of_joining”上之后,我也许可以进行此查询。但这对于做一个简单的查询来说太复杂了,在 MongoDB 中做这样的事情非常简单。

有人可以帮助了解在 DynamoDB 中是否有更好的方法来执行此类查询,以及 DynamoDB 是否真的适合此类用例?

【问题讨论】:

标签: mongodb amazon-dynamodb


【解决方案1】:

实际上,GSI 的分区键不必是唯一的。您可以将date_of_joining 作为 GSI 的分区键。

但是,在查询分区键时,不能使用greater than 作为分区键字段。分区键仅支持相等。我不确定为什么你想要一个随机数作为 GSI 的分区键和 date_of_joining 作为排序键。即使您像这样设计,我也不认为您将能够使用 DynamoDB 查询 API 来获得预期的结果。您最终可能会使用 DynamoDB Scan API,这在 DynamoDB 中是一项昂贵的操作。

GSI:

date_of_joining - as Partition key

在查询 API 中支持:-

如果同一 DOJ 有多个项目,则结果具有多个项目(即当您使用 GSI 查询时)。

KeyConditionExpression : 'date_of_joining = :doj'

查询 API 不支持:-

KeyConditionExpression : 'date_of_joining > :doj'

结论:-

您需要使用 DynamoDB 扫描。如果您要使用 Scan,则可能不需要 GSI。可以使用FilterExpression直接扫描主表。

FilterExpression : 'date_of_joining > :doj'

缺点:-

  • 昂贵

  • 效率不高

【讨论】:

  • 感谢您的回复。我添加一个具有 0-99 数字的列的原因是,由于查询需要分区键的值,我将能够提供值 (0-99)。需要触发 100 个查询,但处理将在整个集群中得到很好的分布。当我将“date_of_joining”作为排序键时,我将能够在它之上进行大于和小于查询。如果不是这样,请告诉我。
  • 扫描不是一个好的选择,因为它会消耗与成本直接相关的读取容量损失。它效率不高,因为它必须读取表中的所有项目,然后应用过滤条件来产生结果。如果表有 10 万个项目,请考虑性能和成本。
【解决方案2】:

您可能决定使用索引后端来支持您的范围查询。例如,您可以使用 Lambda 函数将 DynamoDB 中的表更新流式传输到 AWS ElasticSearch,然后在 ES 中查询与您选择的连接日期范围匹配的记录。

【讨论】:

  • 谢谢亚历山大。现在我们已经被这么多数据库迷失了,我们不想为一个工作负载添加两个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 2017-05-13
相关资源
最近更新 更多