1

我正在使用 dynamoDb 来存储一些附加信息,但我在排序数据时遇到了一些麻烦。

我有以下创建语法storeIdnumber键。我设置number为排序键,但问题是数据根本没有排序。

$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

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

4

1 回答 1

8

只需阅读下面的第一段。排序键用于将具有相同分区键值的所有项目在物理上靠得很近并默认按升序排序(即重要的一点是数据不跨分区键排序)。换句话说,对于相同的分区键,数据默认按升序排序。

例子:-

分区键排序键

p1, s1

p1, s2

p1, s3

p2, s1

p2, s2

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

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

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

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

ScanIndexForward: true || false

ScanIndexForward —(布尔值)

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

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

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

查询接口

于 2017-04-24T20:40:21.753 回答