我有一个DynamoBD表,其中Partition键为id
,Sort键为timestamp
。
我想获取timestamp
==特定日期的记录,按升序排列。不幸的是,每条记录都有一个唯一的随机id
,所以我不能使用timestamp
作为排序键来对数据进行排序。
我正在考虑使用全球二级指数,但它不起作用。
我的全球二级指数:
- 名称:时间戳索引
- 分区键:时间戳
- 排序键:无
我的查询:
options = {'IndexName': 'timestamp-index', 'FilterExpression': Attr('timestamp').contains(yesterday)}
scanner = table.scan(**options)
您有几个选项。好与坏取决于您的记录和查询量。如果将低查询量的好解决方案应用于高查询量,则可能会非常糟糕。
对于可扩展到大容量的解决方案,请查看文档中时间序列数据的设计模式。
这种多表设计以复杂性为代价来购买可扩展性。如果缩放不是一个大问题并且查询相对较少,您可以使用GSI:进行单表设计
GSI1PK (Date) GSI1SK (Time)
2021-11-29 02:00:19.000
2021-11-29 05:11:33.000
2021-11-29 12:57:19.000
2021-11-30 03:33:41.000
2021-11-30 13:33:41.000
2021-11-30 20:33:41.000
您可以使用GSI1PK="2021-11-30" AND GSI1SK>""
查询您的二级索引,以获取11月30日的所有记录。将时间作为GSI SK可以选择按小时查询:AND GSI1SK begins_with("12")
。
默认情况下,query
排序顺序为升序。要反转顺序,请将ScanIndexForward
参数设置为false
。我认为scan
排序顺序是未定义的。