Java中的AWS DynamoDbMapper FilterExpression分页

时间:2018-02-04 07:57:24

标签: java amazon-web-services amazon-dynamodb

我有一个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

1 个答案:

答案 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个或更少的项目,具体取决于   被过滤。