我正在尝试使用Java SDK在DynamoDB中实现分页。
我有一个简单的数据模型,带有HashKey
id和一个日期为RangeKey
。我想查询给定日期后的所有日期。到目前为止,该方法仍然有效,但问题是使用最后评估的键的分页部分。
查询最后一页时,lastEvaluatedKey
不为null,它仍指向查询的最后一页的最后一项。然后将此键设置为è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
不为null吗?当我仅保存符合条件的项目时,LastEvaluatedKey
为预期的空值。 最佳答案
这是DynamoDB的预期行为。
如果LastEvaluatedKey
不为空,则不一定表示结果集中有更多数据。知道何时到达结果集末尾的唯一方法是LastEvaluatedKey
为空。 (source)
这是AWS的设计决策。我能想到的最可能的解释是,要有一个LastEvaluatedKey
,如果有更多项目,则需要不断扫描以查找更多项目,如果您使用过滤器表达式,则可能必须扫描其余项目确定是否有更多项目。此选择有助于最大程度地减少查询(和扫描)操作的延迟。