dynamodb pagination-last evaluated key在最后一页上不为null

wljmcqd8  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(449)

我正在尝试用JavaSDK在dynamodb中实现分页。
我有一个简单的数据模型 HashKey 身份证和日期 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);

有人知道为什么 lastEvaluatedKey 当到达最后一个与 KeyCondition ? 当我只保存与条件匹配的项时 LastEvaluatedKey 按预期为空。

bz4sfanl

bz4sfanl1#

这是dynamodb的预期行为。
如果 LastEvaluatedKey 不是空的,它不一定意味着结果集中有更多的数据。知道何时到达结果集末尾的唯一方法是何时 LastEvaluatedKey 是空的((来源)
这是aws的设计决策。我能想到的最可能的解释是为了 LastEvaluatedKey 如果有更多的项目,他们将有继续扫描以找到更多的项目,如果您使用的是筛选表达式,他们可能必须扫描分区的其余部分以确定是否有更多的项目。这个选择有助于最小化查询(和扫描)操作的延迟。

相关问题