在DynamoDB表中存储相同GSI值的数据的顺序,该表没有GSI上的范围键

时间:2016-06-17 07:17:31

标签: amazon-web-services pagination amazon-dynamodb

我从AWS documentation

引用以下内容
  

具有相同分区键值的项目按排序键按排序顺序存储。如果排序键数据类型为Number,则结果将按数字顺序存储。对于String类型,结果按ASCII字符代码值的顺序存储。对于Binary类型,DynamoDB将二进制数据的每个字节视为无符号。

假设一个表具有全局二级索引(没有相关范围键)将存储相同GSI值的数据的顺序是什么?

DynamoDB是否根据某些属性维护某些顺序,同时将数据存储在表中(仅具有分区键且没有在特定分区键上定义的范围键)具有相同的分区键值(这仅适用于GSI)只是分区键?

例如在下表中将有任何订单,其中3个项目与GameTitle" GalaxyInvaders"会存储在表格中吗?

(GSI)                           (HashKey)
——————————————————————————————————————————
GameTitle           | Score    | UserId
——————————————————————————————————————————
AlienAdventure      | 23       | 101
AttackShip          | 45       | 102
GalaxyInvaders      | 34       | 104
GalaxyInvaders      | 45       | 106
GalaxyInvaders      | 56       | 107

我问这个是因为我在GSI上用 lastEvaluatedKey 进行查询(这个GSI没有范围键,表有一个单独的范围和哈希键),我想知道我是否可以进入这个方向即获得下一页结果并使用 ScanIndexForward 获取上一页结果?

如果保留了一些订单,那么我似乎可以,但我找不到支持性文档。从我迄今为止所做的查询支持我可以进入两个方向。

1 个答案:

答案 0 :(得分:0)

如果没有排序键,DynamoDB将以某些顺序存储一个分区键的数据。这个订单是什么,你不能也不应该假设。

我的意思是,GameTitle的所有行都等于' GalaxyInvaders'将按某些顺序,但您不知道该订单到底是什么。因此,您无法假设行将按ScoreUserId进行排序。这种假设只能用于排序键。

关于Scan的实际问​​题:是的,你可以双向进行。如果您有abcScanIndexForward : true,则可以假定您将返回c,{{1} }和ba