Dynamodb按排序顺序扫描

时间:2014-02-15 07:58:17

标签: amazon-web-services amazon-dynamodb

嗨,我有一张dynamodb表。我希望服务返回此表中的所有项目,顺序是通过对一个属性进行排序。

我是否需要为此创建全局二级索引?如果是这种情况,那么散列键应该是什么,范围键是什么? (注意,对gsi的查询必须在GSI的散列键上指定“EQ”比较器。)

感谢日志!

厄尔本

3 个答案:

答案 0 :(得分:19)

如果你知道HashKey,那么任何查询都将返回按Range键排序的项目:

“查询结果始终按范围键排序。如果范围键的数据类型为Number,则按数字顺序返回结果;否则,结果将按ASCII字符代码值的顺序返回。默认情况下,排序顺序是升序。要反转顺序,请使用ScanIndexForward参数设置为false。“ 查询和扫描操作 - Amazon DynamoDB:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html

现在,如果您需要返回“所有项目”,则表示扫描。我不认为你可以订购扫描结果。

另一种选择是使用GSI。 (例如:https://stackoverflow.com/a/21786544/2959100)。在这里,您可以看到GSI仅包含HashKey。我猜测结果将按此键的排序顺序排列(我还没在程序中检查这部分!)

答案 1 :(得分:4)

我通过创建全局二级索引来解决此问题的方法如下所示。不确定这是否是最佳方法,但如果它对某人有用,则发布它。

Hash Key                 | Range Key
------------------------------------
Date value of CreatedAt  | CreatedAt

对HTTP API用户施加限制以指定检索数据的天数,默认为24小时。

这样,我总是可以将HashKey指定为当前日期,而RangeKey可以使用>和<检索时的运算符。这样,数据也分布在多个分片上。

答案 2 :(得分:1)

截至目前,dynamoDB 扫描 无法返回排序结果。

您需要使用带有hashkey和range字段的新全局二级索引(GSI) 查询 。诀窍是使用为表中的所有数据分配相同值的哈希键。

我建议为所有数据创建一个新字段并调用它" Status"并将值设置为" OK"或类似的东西。

然后,您的查询以获得所有排序的结果将如下所示:

{
    TableName: "YourTable",
    IndexName: "Status-YourRange-index",
    KeyConditions: {
        Status: {
            ComparisonOperator: "EQ", 
            AttributeValueList: [ 
                "OK"
            ]
        }
    },
    ScanIndexForward: false
}

有关如何编写GSI查询的文档,请访问:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html#GSI.Querying