代码之家  ›  专栏  ›  技术社区  ›  Sid Ali

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

  •  3
  • Sid Ali  · 技术社区  · 6 年前

    使用javascript aws sdk和查询dynamodb表,使用document client。该表包含 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}
    

    根据这个 doc

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

    应该不会再回来了 上次评估密钥 在第二个请求中,因为没有更多的元素,但它返回一个元素,该元素在第三个请求中发送给空结果。

    当我尝试 极限=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
    

    那这里发生了什么?

    2 回复  |  直到 6 年前
        1
  •  7
  •   Michael - sqlbot    6 年前

    你所看到的是预料之中的。

    这句话是对的:

    如果结果中没有LastEvaluatedKey,则不再检索任何项

    然而,你似乎认为它暗示了逆条件也是真的,但它不是。。。

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

    这不是第一个语句所暗示的,它在逻辑上不等价,也不是真的。

    如果服务正好达到了您的限制,则它不知道是否有更多匹配的记录可供查找,因此它将为您提供最后一条已评估的记录,以便您可以在下一个请求中继续搜索。也许还有更多,也许没有。这是一个不可避免的结果,优化是必要的,以使结果尽快回到你。否则,服务将需要继续寻找至少一个匹配,即使它已经找到足够满足您的限制。

    如果搜索到结尾时没有达到您的限制,它知道没有更多要搜索的内容,因此不会返回 LastEvaluatedKey .

        2
  •  3
  •   Sid Ali    6 年前

    事实上,我发现根据 doc

    上次评估密钥

    ...

    如果LastEvaluatedKey不为空,则不一定意味着 结果集中有更多数据。唯一知道你什么时候 当LastEvaluatedKey为 空的。

    ...