【问题标题】:How can I Scan an index in reverse in DynamoDB?如何在 DynamoDB 中反向扫描索引?
【发布时间】:2020-10-03 07:25:39
【问题描述】:

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

【问题讨论】:

  • 请出示您的代码
  • 您使用哪个 API 访问 DynamoDB?大多数人不会让您为扫描操作指定ScanIndexForward。您是直接进行网络服务调用吗?

标签: amazon-dynamodb aws-sdk


【解决方案1】:

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

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

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

使用 DynamoDB 与使用传统关系数据库有着根本的不同,您需要对使用它的方式进行重大改变。您需要确定 DynamoDB 在存储和性能、可靠性和可用性方面的可用性优势是否值得接受其局限性。

【讨论】:

  • 是的,你是对的,但 ScanIndexForward 是适用于 Query 而不是 Scan.And 使用 Query 我们只能在 HASH 键和 Range 键上设置过滤器,而不是在其他字段上。完全受够了 DynamoDB。
  • 您可以对 H/R 键以外的属性/字段使用查询过滤器。 aws.amazon.com/blogs/aws/…
  • 澄清 cmets。 Query 操作必须仅采用哈希和范围键标准并对其起作用。有一个可选的查询过滤器可以过滤其他字段。但是,Query 操作仍在读取与哈希和范围键条件匹配的每个项目。它只返回与过滤器匹配的行。理想情况下,哈希和范围键条件应尽可能窄以避免读取太多行。
  • @BharatBhushan ,你做了什么来解决这个问题?你想解释一下吗?
  • 如果您需要这样做,我不同意您关于不使用不正确使用 DynamoDB 的评论。我想在日期属性上创建一个二级索引并返回具有最新日期的项目(首先是最大值)。这怎么算滥用?
【解决方案2】:

到目前为止,dynamoDB 扫描无法返回排序结果。

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

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

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

{
    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

【讨论】:

  • 所以会有一个索引键,不会导致热点吗?也许更好地使用从相同前缀开始的东西并使用 BEGINS_WITH 而不是 EQ?
  • 你想再试一次吗?对 GSI 哈希键使用相同的整个表值是完全没有用的。请记住,在构建表格时,您不能同时提供这两者。你可以只拥有你真正想要的 hash_key。或者使用连接字段作为哈希键。各种丑陋的技巧让 dynamodb 做合理的事情。
猜你喜欢
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 2019-08-26
  • 2022-12-07
相关资源
最近更新 更多