use*_*546 1 sorting amazon-web-services amazon-dynamodb aws-php-sdk
我正在使用 dynamoDb 来存储一些额外的信息,但我在整理数据时遇到了一些麻烦。
我有以下创建语法,其中有 astoreId和number键。我将numberas 排序键设置为排序键,但问题是数据根本没有排序。
$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
]
]);
Run Code Online (Sandbox Code Playgroud)
我的扫描参数:
$scanParams = [
'TableName' => 'foo',
'ProjectionExpression' => '#storeId, #number',
'FilterExpression' => '#number >= :n',
'ExpressionAttributeNames'=> [ '#storeId' => 'storeId', '#number' => 'number'],
'ExpressionAttributeValues' => [
':n' => ['N' => $number]
]
];
Run Code Online (Sandbox Code Playgroud)
我的扫描结果:
StoreId number
68001 80000
25000 37000
463501 527000
4800001 5300000
360001 400000
2000001 2600000
Run Code Online (Sandbox Code Playgroud)
如您所见,数据并未按 number 属性排序。
只需阅读下面的第一段。排序键用于存储相同分区键值的所有项目,物理上紧靠在一起,默认按升序排序(即重要的一点是数据不跨分区键排序)。换句话说,默认情况下,相同分区键的数据按升序排序。
例子:-
分区键排序键
p1, s1
p1, s2
p1, s3
p2, s1
p2, s2
如果表具有复合主键(分区键和排序键),DynamoDB 会按照数据分布:分区键中所述的相同方式计算分区键的哈希值——但它存储具有相同分区键的所有项目值物理上靠近在一起,按排序键值排序。
要将项目写入表,DynamoDB 会计算分区键的哈希值以确定哪个分区应包含该项目。在该分区中,可能有多个项目具有相同的分区键值,因此 DynamoDB 将项目与具有相同分区键的其他项目按排序键升序存储。
要从表中读取项目,您必须指定其分区键值和排序键值。DynamoDB 计算分区键的哈希值,生成可以在其中找到项目的分区。
在 Query API 中,有一个参数可以按升序或降序获取结果。
ScanIndexForward: true || false
Run Code Online (Sandbox Code Playgroud)
ScanIndexForward —(布尔值)
指定索引遍历的顺序:如果为true(默认),则按升序进行遍历;如果为 false,则按降序执行遍历。
具有相同分区键值的项目按排序键按排序顺序存储。如果排序键数据类型为数字,则结果按数字顺序存储。对于 String 类型,结果按 ASCII 字符代码值的顺序存储。对于 Binary 类型,DynamoDB 将二进制数据的每个字节视为无符号。
如果 ScanIndexForward 为 true,DynamoDB 将按照结果的存储顺序(按排序键值)返回结果。这是默认行为。如果 ScanIndexForward 为 false,DynamoDB 将按排序键值逆序读取结果,然后将结果返回给客户端。
| 归档时间: |
|
| 查看次数: |
14765 次 |
| 最近记录: |