我有一个dynamoDb表,该表有几列,
我的主分区键是 - pageId(String),
我还有一个 GSI - pageContainer(String)。
我正在使用DynamoDBMapper来查询/扫描我的表格,
我想在DynamoDb中实现分页,
我认为DynamoDB中的异教徒在 ExclusiveStartKey和LastEvaluatedKey上工作。
在第一页查询/扫描时,ExclusiveStartKey将为null,
查询/扫描第一页后,DynamoDB将返回LastEvaluatedKey。
如果查询结果超过1Mb,或者如果查询/扫描设置了限制,则
LastEvaluatedKey的值,然后用作ExclusiveStartKey来查询/扫描第二页,依此类推。
我的操作需要 pageContainer列上的过滤器表达式开始,
当我试图获取以某个单词开头的数据时,它就像一个" Like"条件与关系数据库进行比较
我在表中有10个值都以#34; Test_test"开头。在pageContainer列中。
这是我的代码 -
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());
问题 -
扫描操作返回LastEvaluatedKey,但是,
结果没有任何结果(空洞反应)。
我指的是以下资源 -
1. https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.QueryScanExample.html
2. Pagination with DynamoDBMapper Java AWS SDK
答案 0 :(得分:1)
您面临的问题与DynamoDB的过滤器和限制如何工作有关。
在DynamoDB中,限制似乎是一种服务保护,用于限制在一次操作中提取的记录数量,在提取数据后将应用过滤器。
例如您正在使用:
scanExpression.withFilterExpression("begins_with(pageContainer,:beginWith)")
.withExpressionAttributeValues(filterMap)
.withExclusiveStartKey(null)
.withLimit(4);
DynamoDB开始获取前4条记录,如果这些记录与过滤器表达式不匹配,则会将它们从响应中删除,并返回0条记录。
我想说的是,如果您使用过滤器,则可能做错了什么,最好创建另一个索引并使用键过滤。
从AWS DynamoDB文档-Working with Queries
限制结果集中的项目数
查询操作使您可以限制其查询的项目数 返回结果。为此,请将Limit参数设置为 您想要的最大物品数。
例如,假设您查询一个表,其限值为6,并且 没有过滤器表达式。查询结果将包含第一个 表中的六个项与来自 请求。
现在假设您向查询中添加了一个过滤器表达式。在这种情况下, DynamoDB会将过滤器表达式应用于以下六个项目: 返回,丢弃不匹配的内容。最终查询结果 将包含6个或更少的项目,具体取决于 被过滤。