DynamoDB分页-最后一页上的最后一个评估键不为null

时间:2018-12-06 14:26:15

标签: java amazon-dynamodb aws-sdk

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

我有一个简单的数据模型,其ID为HashKey,日期为RangeKey。我想查询给定日期后的所有日期。到目前为止,该方法仍然有效,但问题是使用最后评估的键的分页部分。

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

我的代码如下:

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为空。

1 个答案:

答案 0 :(得分:1)

这是DynamoDB的预期行为。

  

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

这是AWS的设计决策。我能想到的最可能的解释是,如果有更多项目,则为了使LastEvaluatedKey能够不断扫描以找到更多项目,并且如果您使用的是过滤器表达式,则可能扫描分区的其余部分以确定是否还有更多项目。此选择有助于最大程度地减少查询(和扫描)操作的延迟。