我正在遵循AWS的最佳实践之一,通过使用状态+日期作为复合排序键来最小化GSI(请参阅https://www.slideshare.net/AmazonWebServices/advanced-design-patterns-for-amazon-dynamodb-dat403-reinvent-2017)。但是,日期没有按正确的顺序写入表中。
每https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TicTacToe.Phase2.html,“因此,如果所有状态前缀都相同(例如,IN_PROGRESS),则用于日期部分的ISO格式将具有从最旧到最新的项目排序。”
那不是我所看到的。我基本上撕开了他们的代码以开始使用,但没有得到这些结果。
这是我用来写入表格的示例:
table = dynamodb.Table('Aware')
now = str(datetime.now())
statusPinDate = "ACTIVE_" + now
updateDate = now
entryTags = entry + '|' + learning + '|' + challenge + '|' + tags
response = table.put_item(
Item={
'PK': awarenessId,
'SK': statusPinDate,
'GSI1PK': userId,
'GSI1SK': entryTags,
'Awareness': {
'UpdateDate': updateDate,
'Feeling': feeling
}
}
)
这是我在运行查询时看到的结果:
"PK (S)","SK (S)"
"AWR-7b2733f9-2a33-4c50-9d24-f45663fdf006","ACTIVE_2019-09-05 21:43:39.623838"
"AWR-08ca298e-06d0-4d7e-bf75-069b14bc23d9","ACTIVE_2019-09-02 20:36:01.656237"
"AWR-2f6ab2a7-9552-4b89-8e7b-4d006c95ec7d","ACTIVE_2019-09-04 19:57:20.179045"
"AWR-30917553-206f-45c6-8cfd-9a45423b8816","ACTIVE_2019-09-03 07:18:10.391391"
"AWR-3a5cd84c-d21f-4f50-81f9-5ebead289ed4","ACTIVE_2019-09-05 07:11:16.909416"
"AWR-4a3acab1-3fd0-4ca6-8939-4c756f196879","ACTIVE_2019-09-04 07:42:41.815524"
"AWR-5c1bc2a9-079d-4e37-b30d-2c39913b7075","ACTIVE_2019-09-07 07:31:50.917259"
"AWR-8e50a379-d22d-4789-ac81-66bb83fc6453","ACTIVE_2019-09-06 07:45:39.578668"
"AWR-bfd4605f-d64a-47ad-a56c-064df7422bc3","ACTIVE_2019-09-03 22:14:40.850001"
"AWR-e0b61340-8371-4357-b3f8-1894cada6db0","ACTIVE_2019-09-03 15:59:53.137947"
"AWR-f5459ee7-27e0-44ab-bb59-596867223eca","ACTIVE_2019-09-06 22:40:26.657986"
我是在做错什么,还是期望AWS以正确的顺序存储是否过多?也许有一种优雅的方式来操纵查询以按顺序获取这些记录。我不想创建另一个GSI,但是它看起来就是这样。
答案 0 :(得分:1)
sort键仅对每个分区键中的值进行排序-而不是独立地。您的示例中所有分区键都是不同的,因此排序键以无顺序显示,正确/预期。
仅当每个分区键在基表或辅助索引中有多行时,此策略才有用。