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

Bha*_*han 6 amazon-dynamodb aws-sdk

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

Jef*_*ger 6

ScanIndexForward是您正在查询的表或索引的范围键以降序获取项目的正确方法.从AWS API参考:

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

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

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

  • 是的,你是对的,但是ScanIndexForward适用于Query而不是Scan.And with Query我们只能在HASH键和Range键上设置过滤器而不在其他字段上.完全厌倦了DynamoDB. (6认同)
  • 我不同意您的意见,即如果您需要这样做,则将不正确使用DynamoDB。我想在date属性上创建二级索引,并返回具有最近日期的项目(首先是最大值)。这怎么会被滥用呢? (2认同)

小智 5

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

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

我建议为所有数据创建一个新字段并将其称为“状态”并将值设置为“OK”或类似的值。

然后,您对所有结果进行排序的查询将如下所示:

{
    TableName: "YourTable",
    IndexName: "Status-YourRange-index",
    KeyConditions: {
        Status: {
            ComparisonOperator: "EQ", 
            AttributeValueList: [ 
                "OK"
            ]
        }
    },
    ScanIndexForward: false
}
Run Code Online (Sandbox Code Playgroud)

有关如何编写 GSI 查询的文档可在此处找到:http : //docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html#GSI.Querying