【问题标题】:How to set limit on result of a query in dynamodb如何在 dynamodb 中设置查询结果的限制
【发布时间】:2019-11-17 13:22:12
【问题描述】:

我有一个要求,在 Dynamodb 中查询表时只需要返回一行。 我可以在 aws-cli 中看到一个名为“max-items”的参数,它显然限制了查询的结果大小。这是示例查询:

aws dynamodb query --table-name testTable --key-condition-expression "CompositePartitionKey = :pk" 
--expression-attribute-values '{ ":pk": { "S": "1234_125" }, ":ps": { "S": "SOME_STATE" }
    }' 
--filter-expression 'StateAttribute IN (:ps) AND attribute_not_exists(AnotherAttribute)' 
--index-name GSI_PK_SK --endpoint-url http://localhost:8000    --max-items 1

但我无法在 Go 中找出任何类似的关键字/属性。

以下是我能找到的相关内容:How to set limit of matching items returned by DynamoDB using Java?

【问题讨论】:

    标签: go amazon-dynamodb


    【解决方案1】:

    正如您在 DynamoDB 的“查询”操作的官方描述 - https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html 中看到的 - 您正在寻找的参数是“限制”。请查阅您的 Go 库文档,了解如何将此参数准确传递给查询。

    顺便请注意,Limit 并没有完全限制返回结果的数量,而是限制在服务器端读取的行数。如果您的查询有过滤器,它可以返回少于限制的结果。我不知道这对你是否重要。

    【讨论】:

    • 感谢您的回复。您已经正确提到了“限制”的作用。 但我的用例与 Limit 不同。我想限制在评估查询后返回的结果(类似于 Mysql 中的限制) 但是 Dynamodb 中的“限制”所做的是,它将要评估的行限制为给定的限制大小(在在这种情况下,我什至可能不会从查询中得到一个结果,即使实际上数据库中有相关的行)。还有一件事,我使用的是 1.13.1 版本的 Go,我没有看到文档中提供任何此类方法/方式。进一步的帮助表示赞赏。
    • 不幸的是,没有办法做你想做的事。如果您使用过滤,即使是查询的最大页面大小(如果未通过限制,则默认为 1MB 读取)也可能在过滤后根本不会返回任何内容。您必须记住的是,您为过滤之前读取的数据量付费。如果过滤读取大量数据并将其中大部分过滤掉,这将花费您很多钱——即使通过网络传递的项目数量只是一项。
    • 感谢您的更新。我想我只有一个选择,即获取所有数据并只处理第一个。
    • 是的,只是您不需要获取“所有数据”,您还可以设置一个限制,只是为您可能获得零结果并需要获取更多页面做好准备,直到你会得到你正在寻找的第一个结果。
    【解决方案2】:

    您可能想研究分页。您可以使用page-size 来控制每次查询可以获得多少。

    关于分页的更多细节可以在Paginating Table Query Results找到。

    【讨论】:

    【解决方案3】:

    您需要对 DynamoDB 的响应进行分页,直到满足您的“用户限制”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多