使用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
那么这里发生了什么?
答案 0 :(得分:4)
所见即所得。
这句话是真的:
如果结果中没有LastEvaluatedKey,则不再有要检索的项目
但是,您似乎假设它暗示逆条件也成立,但事实并非如此。
如果没有要检索的项目,则结果#false中没有LastEvaluatedKey。
这不是第一条语句所暗示的,它在逻辑上不是等效的,也不是真的。
如果该服务正好达到您的限制,那么它将不知道是否可能找到更多匹配的记录,因此它将为您提供最后一条经过评估的记录,以便您可以继续搜索下一个请求。可能会有更多,可能没有。这是为了尽快将结果返回给您而进行的优化的必然结果。否则,该服务将需要继续寻找至少一个匹配项,即使它已找到足以满足您限制的匹配项。
如果搜索没有达到您的限制而到达末尾,则说明没有其他要搜索的内容,因此它不会返回LastEvaluatedKey
。
答案 1 :(得分:3)
根据doc
,我发现这是预期的结果LastEvaluatedKey
...
如果LastEvaluatedKey不为空,则不一定表示 结果集中有更多数据。知道你什么时候的唯一方法 当LastEvaluatedKey为时,已达到结果集的末尾 空。
...