【问题标题】:Why is DynamoDB LastEvaluatedKey depends on the limit of the query?为什么 DynamoDB LastEvaluatedKey 取决于查询的限制?
【发布时间】:2019-01-12 13:22:30
【问题描述】:

使用 javascript aws-sdk 并通过文档客户端查询 dynamodb 表。该表包含 10 个元素 和查询 limit = 5

对于每个请求,我使用 LastEvaluatedKey 构建一个新查询并发送一个新请求,结果如下:

first request --> {Items: Array(5), Count: 5, ScannedCount: 5, LastEvaluatedKey: {…}}
second request --> {Items: Array(5), Count: 5, ScannedCount: 5, LastEvaluatedKey: {…}}
third request --> {Items: Array(0), Count: 0, ScannedCount: 0}

据此doc

如果结果包含 LastEvaluatedKey 元素,请继续执行步骤 2。 如果结果中没有 LastEvaluatedKey,则没有 更多待检索项目

它应该在第二个请求中不返回 LastEvaluatedKey,因为没有更多元素,但它返回一个在第三个请求中发送到空结果的元素。

当我尝试使用 limit = 4 时,一切都按预期工作

first request --> {Items: Array(4), Count: 4, ScannedCount: 4, LastEvaluatedKey: {…}}
second request --> {Items: Array(4), Count: 4, ScannedCount: 4, LastEvaluatedKey: {…}}
third request --> {Items: Array(2), Count: 2, ScannedCount: 2} <--- there is no LastEvaluatedKey as expected

那么这里发生了什么?

【问题讨论】:

  • 如果您在这里没有得到答案,我建议您在 AWS 论坛上提出这个问题。
  • 好的,谢谢,我会的。
  • 我假设当 aws 达到限制“5”时,它只会记录密钥,并且由于它不会向前看,它不知道还有多少项目需要扫描。相当简单的逻辑
  • @CanSahin 这是我想知道的,如果它是“根据文档”预期的结果,或者不是。我本来希望有来源的评论。

标签: amazon-web-services pagination nosql amazon-dynamodb


【解决方案1】:

你所看到的是预期的。

此说法属实:

如果结果中没有 LastEvaluatedKey,则没有要检索的项目

但是,您似乎假设它暗示逆条件也是正确的,但事实并非如此......

如果没有更多要检索的项目,则结果中没有 LastEvaluatedKey #false

这不是第一个陈述所暗示的,它在逻辑上不是等价的,也不正确。

如果服务恰好达到您的限制,那么它不知道是否有更多匹配的记录要查找,因此它会为您提供最后评估的记录,以便您可以在下一个请求时继续搜索。可能有,也可能没有。这是尽快将结果返回给您所必需的优化的必然结果。否则,该服务将需要继续寻找至少一个更多匹配项,即使它已经找到了足以满足您的限制的内容。

如果搜索结束但未达到您的限制,则它知道没有更多可搜索的内容,因此它不会返回 LastEvaluatedKey

【讨论】:

  • 非常好,我很高兴知道这一点。然而,令人遗憾的是,dynamodb 不能简单地告诉您是否还有更多项目。例如,它本可以返回 NextKeyValue。如果没有更多,则保证为空/不存在。
  • @SamanthaAtkins 它不能这样做,因为它还不知道。当达到请求的限制时,服务做的最快的事情就是停止查找并立即返回响应。下一个请求是告诉它继续查找以及从哪里开始查找以查看是否还有更多。任何其他实现都需要延迟响应,同时检查是否有更多项目匹配。就响应能力和资源使用而言,这是最有效的设计。
【解决方案2】:

实际上我发现这是doc的预期结果

LastEvaluatedKey

...

如果 LastEvaluatedKey 不为空,并不一定意味着 结果集中有更多数据。唯一知道你什么时候的方法 已经到达结果集的末尾是 LastEvaluatedKey 是 空。

...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 2010-09-25
    相关资源
    最近更新 更多