首页 文章

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

提问于
浏览
0

我正在使用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

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

1 回答

  • 1

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

    Example:-

    Partition Key Sort Key

    p1,s1

    p1,s2

    p1,s3

    p2,s1

    p2,s2

    如果表具有复合主键(分区键和排序键),DynamoDB将以与“数据分发:分区键”中所述相同的方式计算分区键的哈希值,但它会存储具有相同分区的所有项目键值物理上靠近在一起,按排序键值排序 . 要将项写入表,DynamoDB会计算分区键的哈希值,以确定哪个分区应包含该项 . 在该分区中,可能有多个具有相同分区键值的项目,因此DynamoDB使用相同的分区键将项目存储在其他项目中,按排序键按升序排列 . 要从表中读取项目,必须指定其分区键值和排序键值 . DynamoDB计算分区键的哈希值,从而产生可以在其中找到项的分区 .

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

    ScanIndexForward: true || false
    

    ScanIndexForward — (Boolean)

    指定索引遍历的顺序:如果为true(默认值),则以递增顺序执行遍历;如果为false,则以递减顺序执行遍历 .

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

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

    Query API

相关问题