我一直在评估我们的数据存储从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是否真的适合此类用例?
答案 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以查找与您选择的连接日期范围相匹配的记录。