【问题标题】:Dynamodb AWS Java scan withLimit is not workingDynamodb AWS Java 扫描 withLimit 不起作用
【发布时间】:2017-06-05 22:02:53
【问题描述】:
我正在尝试使用 Java aws-sdk 版本 1.11.140 使用 DynamoDBScanExpression withLimit of 1
即使我使用 .withLimit(1) 即
List<DomainObject> result = mapper.scan(new DynamoDBScanExpression().withLimit(1));
返回所有条目的列表,即 7. 我做错了吗?
附:我尝试使用 cli 进行此查询和
aws dynamodb scan --table-name auditlog --limit 1 --endpoint-url http://localhost:8000
只返回 1 个结果。
【问题讨论】:
标签:
java
amazon-dynamodb
aws-java-sdk
【解决方案1】:
DynamoDBMapper.scan 将返回一个 PaginatedScanList - 分页结果在用户执行需要它们的操作时按需加载。一些操作,例如 size(),必须获取整个列表,但结果会在可能的情况下逐页延迟获取。
因此,DynamoDBScanExpression 上的limit 参数集是每页要获取的最大项目数。
因此,在您的情况下,会返回一个 PaginatedList,当您执行 PaginatedList.size 时,它会尝试从 Dynamodb 加载所有项目,在后台,这些项目每页加载 1 个(每个页面都是对 DynamoDb 的获取请求)直到它到达 PaginatedList 的末尾。
由于您只对第一个结果感兴趣,因此在不从 Dynamo 获取所有 7 个项目的情况下获得该结果的好方法是:
Iterator it = mapper.scan(DomainObject.class, new DynamoDBScanExpression().withLimit(1)).iterator();
if ( it.hasNext() ) {
DomainObject dob = (DomainObject) it.next();
}
使用上面的代码,只有第一个项目会从 dynamodb 中获取。
要点是:DynamoDBQueryExpression 中的limit 参数仅用于分页目的。这是对每页项目数量的限制,而不是对可以请求的页数的限制。