amazon-web-services - AWS DynamoDB 查询和排序
问题描述
一个社交媒体应用程序,人们可以在其中发表帖子。帖子由作者、时间戳、主题和正文组成。这些帖子存储在 DynamoDB 中,其中 Author 作为分区键,TimeStamp 作为排序键。
如何查询今天的所有帖子?我希望返回的结果按时间戳排序,因此扫描 DynamoDB 不是一种选择。
Query 操作根据主键值查找项目。所以我必须定义一个全局二级索引。但我找不到合适的选项来检索今天的所有帖子。这里有什么好的选择?
解决方案
您可以添加一个属性来表示日期(您的 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:)
。
这种方法引入了热分区键问题。查看时间序列数据模型以了解有关此方法的更多信息以及如何处理它
推荐阅读
- mac-address - 如何使用 MAC 地址阻止 OpenVPN 访问
- python - 使用 BeautifulSoup在流文本B中刮取 B
- python - 通过重复序列填充列
- excel - Power Pivot 多对多关系
- google-apps-script - 使用 Google 应用脚本更改 Google 表格共享设置
- typescript - 如何使用 Typescript 在 Material UI 中扩展调色板
- swift - 有没有办法让 SwiftUI 文本标签在显示计时器时不会轻微移动?
- javascript - FindDomNode 弃用警告,尽管使用了 ref
- java - 如何在不损坏的情况下将图像从 java 套接字服务器发送到导航器?
- laravel - 无法打开 laravel.log - ec2 Aws 中的权限错误