DynamoDB 分页 - 最后评估的键在最后一页不为空

Kev*_*Dev 5 java amazon-dynamodb aws-sdk

我正在尝试使用 Java SDK 在 DynamoDB 中实现分页。

我有一个简单的数据模型,一个HashKeyid 和一个日期为RangeKey. 我想查询给定日期之后的所有日期。到目前为止,这有效,但问题是使用最后一个评估键的分页部分。

查询最后一页时,lastEvaluatedKey不为空,仍指向查询的最后一页的最后一项。使用此键设置的另一个查询èxclusiveStartKey则返回 0 结果,带有null lastEvaluatedKey.

我的代码如下所示:

var query = new DynamoDBQueryExpression<DynamoModel>();
var keyCondition = ImmutableMap.<String, AttributeValue>builder()
        .put(":v_userid", new AttributeValue().withS(userId))
        .put(":v_date", new AttributeValue().withS(date.toString()))
        .build();

if (!StringUtils.isEmpty(lastKey)) {
    query.setExclusiveStartKey(ImmutableMap.<String, AttributeValue>builder()
            .put("userId", new AttributeValue().withS(userId))
            .put("date", new AttributeValue().withS(lastKey)).build());
}

query.withKeyConditionExpression("userId = :v_userid AND date >= :v_date");
query.withExpressionAttributeValues(keyCondition);
query.setLimit(2);

QueryResultPage<DynamoModel> resultPage = mapper.queryPage(DynamoModel.class, query);
Run Code Online (Sandbox Code Playgroud)

有人知道为什么lastEvaluatedKey在到达与 匹配的最后一个项目时 不为空KeyCondition吗?当我只保存符合条件的项目时,LastEvaluatedKey正如预期的那样为空。

Mat*_*ope 7

这是 DynamoDB 的预期行为。

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

这是 AWS 的设计决策。我能想到的最可能的解释是,LastEvaluatedKey如果有更多项目,他们将继续扫描以找到更多项目,如果您使用过滤器表达式,他们可能必须扫描其余项目分区以确定是否还有更多项目。这是一种有助于最大限度地减少查询(和扫描)操作延迟的选择。