首页 > 解决方案 > AWS DynamoDB 查询和排序

问题描述

一个社交媒体应用程序,人们可以在其中发表帖子。帖子由作者、时间戳、主题和正文组成。这些帖子存储在 DynamoDB 中,其中 Author 作为分区键,TimeStamp 作为排序键。

如何查询今天的所有帖子?我希望返回的结果按时间戳排序,因此扫描 DynamoDB 不是一种选择。

Query 操作根据主键值查找项目。所以我必须定义一个全局二级索引。但我找不到合适的选项来检索今天的所有帖子。这里有什么好的选择?

标签: amazon-web-servicesnosqlamazon-dynamodb

解决方案


您可以添加一个属性来表示日期(您的 GSI 主键)并将时间戳属性设置为您的 GSI 排序键

例子:

|   AuthorId  | Timestamp(GSI SK) | DayAttribute (GSI PK) |
|:-----------:|------------------:|:---------------------:|
| authord_id  |    1534522921     |     2018-08-17        |    
| authord_id2 |    1534522922     |     2018-08-17        |    
| authord_id3 |    1534522923     |     2018-08-18        |    

当您查询 GSI 时,它将按时间排序。

编辑您的评论:

它不是添加属性来满足您的查询需求的好方法。在这种情况下,我可以建议分层使用排序键。

这意味着将您最相关的查询组合在一个 GSI 键中,并使用分层排序键。假设您只想查询以月、周、日、小时、分钟为单位的分段..

这将是桌子

|   AuthorId  |      Timestamp(GSI SK)      |   MonthAttr (GSI PK)  |
|:-----------:|----------------------------:|:---------------------:|
| authord_id  |    2018:08:17::10:03:25     |       2018-08         |    
| authord_id  |    2018:08:17::10:03:25     |       2018-08         |    
| authord_id  |    2018:08:18::10:03:25     |       2018-08         |    

在此表中,通过使用排序键条件,例如begins_with,您可以查询本月的所有项目,或者在 10 到 15 天之间,或者在 10 到 12 小时之间的特定日期等等。

例如,对于过去 13 天的查询,SortKey 条件是begins_with(2018:08:04:),过去一小时的查询是 like begins_with(2018:08:17:10:)

这种方法引入了热分区键问题。查看时间序列数据模型以了解有关此方法的更多信息以及如何处理它


推荐阅读