使用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,因为没有更多的元素,但是它在第三个请求中返回一个发送到空结果的元素。
当我尝试使用 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
那么这里发生了什么呢?
最佳答案
您所看到的是预期的。
这句话是对的:
但是,您似乎假设它暗示逆条件也成立,但事实并非如此……
这不是第一条语句所隐含的意思,它在逻辑上不是等效的,也不是正确的。
如果该服务正好达到您的限制,那么它将不知道是否可能找到更多匹配的记录,因此它将为您提供最后一条经过评估的记录,以便您可以继续搜索下一个请求。可能会有更多,可能没有。这是为了尽快将结果返回给您而进行的必要优化的必然结果。否则,该服务将需要继续寻找至少一个匹配项,即使它已找到足以满足您的限制的匹配项。
如果搜索没有达到您的限制而到达末尾,它将知道没有其他要搜索的内容,因此它不会返回LastEvaluatedKey
。