支持DynamoDB中的文档查询

时间:2017-02-03 06:04:03

标签: mongodb amazon-dynamodb

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

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

例如,如果我有一份包含员工信息的文件, {  "姓名":" John Doe",  "部门":"销售",  " date_of_joining":" 2017-01-21" }

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

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

2 个答案:

答案 0 :(得分:1)

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

但是,在查询分区键时,不能将greater than用于分区键字段。分区键仅支持相等。我不确定为什么你想要一个随机数作为GSI的分区键和date_of_joining作为排序键。即使您设计的类似,我也不会使用DynamoDB Query 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扫描。如果要使用扫描,则可能不需要GSI。您可以使用FilterExpression直接扫描主表。

FilterExpression : 'date_of_joining > :doj'

<强>缺点: -

  • 昂贵的

  • 效率不高

答案 1 :(得分:0)

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