Ani*_*aje 4 java amazon-web-services amazon-dynamodb
我有一个 dynamoDb 表,该表有几列,
我的主分区键是 - pageId (String),
我还有一个GSI - pageContainer(String)。
我正在使用 DynamoDBMapper 查询/扫描我的表,
我试图在 DynamoDb 中实现分页,
我了解 DynamoDB 中的分页适用于ExclusiveStartKey 和 LastEvaluatedKey。
ExclusiveStartKey 在第 1 页查询/扫描时将为 null,查询/扫描第 1 页后,DynamoDB 将返回 LastEvaluatedKey。
如果查询结果大于1Mb或者对查询/扫描设置了限制,
则将LastEvaluatedKey的值作为ExclusiveStartKey来查询/扫描第2页,以此类推。
我的操作需要在pageContainer 列上使用过滤器表达式 beginWith,
因为我试图获取以某个单词开头的数据,这就像与关系数据库进行比较的“Like”条件。我在表中有 10 个值,在 pageContainer 列中全部以“Test_test”开头。
这是我的代码 -
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().withEndpointConfiguration(
new AwsClientBuilder.EndpointConfiguration(DYNAMO_DB_ENDPOINT, DYNAMO_DB_REGION))
.build();
DynamoDBMapper mapper = new DynamoDBMapper(dynamoDBClient);
String beginWith = "Test_test";
HashMap<String, AttributeValue> filterMap = new HashMap<>();
filterMap.put(":beginWith", new AttributeValue().withS(beginWith));
DynamoDBScanExpression scanExpression = new DynamoDBScanExpression();
scanExpression.withFilterExpression("begins_with(pageContainer,:beginWith)")
.withExpressionAttributeValues(filterMap)
.withExclusiveStartKey(null)
.withLimit(4);
ScanResultPage<PageModel> scanPage = mapper.scanPage(PageModel.class, scanExpression);
List<PageModel> pageCmsDomains = scanPage.getResults();
Map<String, AttributeValue> lastEvaluatedKey = scanPage.getLastEvaluatedKey();
System.out.println("LastEvaluatedKey=" + scanPage.getLastEvaluatedKey());
Run Code Online (Sandbox Code Playgroud)
问题 -
扫描操作返回了 LastEvaluatedKey,但是没有任何结果(空响应)。
我指的是以下资源 -
1. https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.QueryScanExample.html
2.使用 DynamoDBMapper Java AWS SDK 进行分页
您面临的问题与 DynamoDB 中过滤和限制的工作方式有关。
在 DynamoDB 中,限制似乎是一种服务保护,限制在单个操作中获取的记录数量,在获取数据后应用过滤器。
例如您正在使用:
scanExpression.withFilterExpression("begins_with(pageContainer,:beginWith)")
.withExpressionAttributeValues(filterMap)
.withExclusiveStartKey(null)
.withLimit(4);
Run Code Online (Sandbox Code Playgroud)
DynamoDB 开始获取前 4 条记录,如果记录与过滤器表达式不匹配,它们将从响应中删除,返回 0 条记录。
我想说,如果你正在使用过滤器,你可能做错了什么,你最好创建另一个索引并使用键过滤。
来自 AWS DynamoDB 文档 -使用查询
限制结果集中的项目数
查询操作允许您限制结果中返回的项目数。为此,请将限制参数设置为所需的最大项目数。
例如,假设您查询一个表,限制值为 6,并且没有过滤表达式。查询结果将包含表中与请求中的关键条件表达式匹配的前六个项目。
现在假设您向查询添加过滤器表达式。在这种情况下,DynamoDB 会将过滤器表达式应用于返回的六个项目,并丢弃那些不匹配的项目。最终查询结果将包含 6 个或更少的项目,具体取决于过滤的项目数。
| 归档时间: |
|
| 查看次数: |
4909 次 |
| 最近记录: |