为什么DynamoDB LastEvaluatedKey取决于查询的限制?

Zec*_*ide 4 pagination amazon-web-services nosql amazon-dynamodb

使用javascript aws-sdk并通过文档客户端查询dynamodb表。该表包含10个元素,查询限制= 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}
Run Code Online (Sandbox Code Playgroud)

根据这份文件

如果结果包含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
Run Code Online (Sandbox Code Playgroud)

那么这里发生了什么?

Zec*_*ide 7

实际上我发现这是根据文档的预期结果

上次评估键

...

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

...


Mic*_*bot 7

您所看到的是预期的。

这句话是对的:

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

但是,您似乎假设它暗示逆条件也成立,但事实并非如此……

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

这不是第一条语句所暗示的,在逻辑上不是等效的,也不是正确的。

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

如果搜索没有达到您的限制而到达末尾,则表明没有其他要搜索的内容,因此不会返回LastEvaluatedKey

  • @SamanthaAtkins 它不能这样做,因为它还不知道。当达到请求的限制时,服务要做的最快的事情就是停止查找并立即返回响应。下一个请求告诉它继续查找以及从哪里开始查找是否还有更多。任何其他实现都需要延迟响应,同时检查是否有更多项目匹配。就响应能力和资源使用而言,这是最有效的设计。 (2认同)