想象一下以下函数,它查询GlobalSecondaryIndex和相关的Range Key,以便找到有限数量的结果:
@Override
public List<Statement> getAllStatementsOlderThan(String userId, String startingDate, int limit) {
if(StringUtils.isNullOrEmpty(startingDate)) {
startingDate = UTC.now().toString();
}
LOG.info("Attempting to find all Statements older than ({})", startingDate);
Map<String, AttributeValue> eav = Maps.newHashMap();
eav.put(":userId", new AttributeValue().withS(userId));
eav.put(":receivedDate", new AttributeValue().withS(startingDate));
DynamoDBQueryExpression<Statement> queryExpression = new DynamoDBQueryExpression<Statement>()
.withKeyConditionExpression("userId = :userId and receivedDate < :receivedDate").withExpressionAttributeValues(eav)
.withIndexName("userId-index")
.withConsistentRead(false);
if(limit > 0) {
queryExpression.setLimit(limit);
}
List<Statement> statementResults = mapper.query(Statement.class, queryExpression);
LOG.info("Successfully retrieved ({}) values", statementResults.size());
return statementResults;
}
List<Statement> results = statementRepository.getAllStatementsOlderThan(userId, UTC.now().toString(), 5);
assertThat(results.size()).isEqualTo(5); // NEVER passes
每当我查询数据库时,都不会遵守限制。我总是收到符合我的搜索条件的所有结果,因此,如果我将startingDate
设置为now
,那么我会获得数据库中的所有项目,因为它们都比now
更早。
答案 0 :(得分:1)
您应该使用queryPage
功能代替query
。
来自DynamoDBQueryExpression.setLimit
文档:
设置每个服务请求中要检索的最大项目数 到DynamoDB。
注意调用DynamoDBMapper.query时,多个 如果需要检索整个结果,则会向DynamoDB发出请求 组。设置此项将限制每个项检索的项目数 请求,而不是将检索的结果总数。使用 DynamoDBMapper.queryPage从中检索单页的项目 DynamoDB。