从API文档中,dynamo db确实支持扫描和查询操作的分页。这里的要点是将当前请求的ExclusiveStartIndex
设置为先前请求的LastEvaluatedIndex
的值,以获得结果的下一组(逻辑页面)。分页与DynamoDBMapper Java AWS SDK
我试图实现相同的功能,但我使用的是DynamoDBMapper
,这似乎有很多优势,比如与数据模型的紧密耦合。所以,如果我想要做上述情况,我假设我会做类似如下:
// Mapping of hashkey of the last item in previous query operation
Map<String, AttributeValue> lastHashKey = ..
DynamoDBQueryExpression expression = new DynamoDBQueryExpression();
...
expression.setExclusiveStartKey();
List<Table> nextPageResults = mapper.query(Table.class, expression);
我希望我的上述认识是在使用DynamoDBMapper分页正确的。其次,我怎么知道我已经达到了结果的最后。从文档,如果我使用下面的API:
QueryResult result = dynamoDBClient.query((QueryRequest) request);
boolean isEndOfResults = StringUtils.isEmpty(result.getLastEvaluatedKey());
反观使用DynamoDBMapper,我怎么能知道我是否已经达到在这种情况下的结果结束。
如果'limit'是在使用'query'时设置为2,它仍然返回所有记录。这是为什么? – user7
@ user7实际上,底层实现('PaginatedQueryList')正在为您处理分页时,它只显示它正在返回所有记录。查看['PaginatedQueryList']的文档(https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/PaginatedQueryList.html)。它的行为与我上面发布'scan'相同。基本上,如果迭代它,它最终将获取所有元素,因为它会自动执行分页调用。 – mkobit
那么'withLimit'不适用于它? – user7