DynamoDB使用排序键排序数据不起作用

时间:2017-04-24 18:18:54

标签: sorting amazon-web-services amazon-dynamodb aws-php-sdk

我使用dynamoDb来存储一些额外的信息但我在排序数据时遇到了一些麻烦。

我有以下创建语法,其中有numbernumber个键。我将$response = $dynamoDb->createTable([ 'TableName' => 'foo', 'KeySchema' => [ [ 'AttributeName' => 'storeId', 'KeyType' => 'HASH' //Partition key ], [ 'AttributeName' => 'number', 'KeyType' => 'RANGE' // sort Key ] ], 'AttributeDefinitions' => [ [ 'AttributeName' => 'storeId', 'AttributeType' => 'N' ], [ 'AttributeName' => 'number', 'AttributeType' => 'N' ] ], 'ProvisionedThroughput' => [ 'ReadCapacityUnits' => 20, 'WriteCapacityUnits' => 20 ] ]); 设置为排序键,但问题是数据根本没有排序。

$scanParams = [
    'TableName' => 'foo',
    'ProjectionExpression' => '#storeId, #number',
    'FilterExpression' => '#number >= :n',
    'ExpressionAttributeNames'=> [ '#storeId' => 'storeId', '#number' => 'number'],
    'ExpressionAttributeValues' => [
        ':n' => ['N' => $number]
    ]
];

我的扫描参数:

StoreId number
68001   80000
25000   37000
463501  527000
4800001 5300000
360001  400000
2000001 2600000

我的扫描结果:

if [ -d user_records]
# --^--

如您所见,数据未按数字属性排序。

1 个答案:

答案 0 :(得分:1)

请阅读下面的第一段。排序键用于存储物理上靠近在一起的相同分区键值的所有项目,并且默认按升序排序(即重要的一点是数据不在分区键上排序)。换句话说,默认情况下,对于相同的分区键,数据按升序排序。

示例: -

分区键排序键

p1,s1

p1,s2

p1,s3

p2,s1

p2,s2

  

如果表具有复合主键(分区键和排序键),   DynamoDB计算分区键的哈希值   数据分布:分区键中描述的方式 - 但它存储所有   具有相同分区键值的项目在物理上接近   在一起,按排序键值排序。

     

要将项目写入表格,DynamoDB会计算哈希值   用于确定应包含哪个分区的分区键   项目。在该分区中,可能有几个具有相同的项目   分区键值,因此DynamoDB将项目存储在其他项目中   相同的分区键,按排序键按升序排列。

     

要从表中读取项目,必须指定其分区键   值和排序键值。 DynamoDB计算分区键的哈希值   value,产生可以找到项目的分区。

在Query API中,有一个参数可以按升序或降序获取结果。

ScanIndexForward: true || false

ScanIndexForward - (布尔值)

指定索引遍历的顺序:如果为true(默认值),则按升序执行遍历;如果为false,则按降序执行遍历。

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

如果ScanIndexForward为true,DynamoDB将按照存储顺序返回结果(按排序键值)。这是默认行为。如果ScanIndexForward为false,则DynamoDB按排序键值以相反顺序读取结果,然后将结果返回给客户端。

Query API