如何在DynamoDB中反向扫描索引?

时间:2014-10-08 05:56:58

标签: amazon-dynamodb aws-sdk

我目前正在使用DynamoDB并且扫描时遇到问题。我可以使用ExclusiveStartKey以正向顺序获取分页结果。但是,无论我将ScanIndexForward设置为true还是false,我都会从扫描操作中按顺序获得结果。如何从DynamoDB中的Scan以相反的顺序获得结果?

2 个答案:

答案 0 :(得分:5)

ScanIndexForward是通过查询的表或索引的范围键以降序获取项目的正确方法。来自AWS API Reference

  

指定升序(true)或降序(false)的值   遍历索引。 DynamoDB返回反映结果的结果   请求的顺序由范围键确定。如果数据类型是   数字,结果以数字顺序返回。对于String类型,   结果按ASCII字符代码值的顺序返回。对于   类型二进制,DynamoDB将二进制数据的每个字节视为无符号   当它比较二进制值时。

根据docs for Scan,我得出结论无法反向扫描 。但是,如果您需要这样做,我会说您没有正确使用DynamoDB。在为DyanmoDB等数据库设计模式时,您应该根据预期的查询来规划模式,以确保几乎所有应用程序查询都具有良好的索引。扫描更多用于系统管理员操作或用于MapReduce或分析。 "扫描操作始终扫描整个表,然后过滤掉值以提供所需的结果,实质上是添加从结果集中删除数据的额外步骤。" (Query and Scan Performance)这可能导致performance problems and other issues

使用DynamoDB与使用传统关系数据库完全不同,并且需要对您使用它的方式进行重大更改。您需要确定DynamoDB在存储和性能,可靠性和可用性方面的可用性优势是否值得接受其限制。

答案 1 :(得分:3)

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

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

我建议为所有数据创建一个新字段并调用它" 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