当前位置: 首页 > 知识库问答 >
问题:

AWS DynamoDbMapper过滤器在Java中的表达式分页

潘弘博
2023-03-14

我有一个dynamoDb表,该表有两列,
我的主分区键是-pageId(String),
我还有一个GSI-pageContainer(String)。

我正在使用DynamoDBMapper查询/扫描我的表,
我正在尝试在DynamoDb中实现分页,
我了解DynamoDb中的分页工作在ExclusiveStarKey和LastEvaluatedKey上。

ExclusiveStartKey在第一页查询/扫描时为空,查询/扫描第一页后,DynamoDB将返回最后一个EvaluatedKey。

如果查询结果超过1Mb,或者对查询/扫描设置了限制,则最后一个EvaluatedKey的值将用作排他性的EStartKey,以查询/扫描第二页,依此类推。

我的操作需要一个筛选器表达式beginsWith,在pageContainer列上,
因为我试图获取以某个单词开头的数据,这就像将“like”条件与关系数据库进行比较一样。
表中有10个值,所有值都以pageContainer列中的“Test\u 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());

问题-
扫描操作正在向我返回LastEvaluatedKey,但结果中没有任何内容(空响应)。

我指的是以下资源-
1。https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.QueryScanExample.html
2。使用DynamoDBMapperJavaAWS SDK分页

共有1个答案

百里星纬
2023-03-14

您面临的问题与DynamoDB的过滤器和限制如何工作有关。

在DynamoDB中,限制似乎是一种服务保护,它限制在单个操作中获取的记录数量,在获取数据后应用过滤器。

例如,您正在使用:

scanExpression.withFilterExpression("begins_with(pageContainer,:beginWith)")
                .withExpressionAttributeValues(filterMap)
                .withExclusiveStartKey(null)
                .withLimit(4);

DynamoDB开始获取前4条记录,如果这些记录与筛选器表达式不匹配,它们将从响应中删除,返回0条记录。

我想说,如果您使用的是过滤器,那么您可能做错了什么,您最好创建另一个索引并使用键过滤。

来自AWS DynamoDB文档-使用查询

限制结果集中的项数

查询操作允许限制它在结果中返回的项数。为此,请将Limit参数设置为所需的最大项数。

例如,假设查询一个限制值为6且没有筛选表达式的表。查询结果将包含表中与请求中的键条件表达式匹配的前六项。

现在假设您向查询中添加了一个过滤器表达式。在这种情况下,DynamoDB将对返回的六个项应用过滤器表达式,丢弃不匹配的项。最终查询结果将包含6个或更少的项,具体取决于筛选的项数。

 类似资料:
  • 过滤表达式 mitmproxy工具中的许多命令都使用过滤器表达式。过滤器表达式由以下运算符组成: 命令 描述 〜a 匹配响应资源:CSS,Javascript,Flash,images。 〜b regex Body 〜bq regex 请求的Body 〜bs regex 响应的Body 〜c int HTTP响应码 〜d regex 域名 〜dst regex 匹配目标地址 〜e 匹配错误 〜h

  • null java: type.java: 人与嗜好之间是1:m关系,类型与嗜好之间是1:m关系。

  • 问题内容: 我在为ElasticSearch Regexp Filter正确表达正则表达式时遇到问题。我正在尝试匹配url字段中“ info-for / media”中的任何内容,例如http://mydomain.co.uk/info-for/media/press- release-1 。为了尝试正确使用我现在使用的正则表达式,但这最终将与用户的查询字符串一起使用。 POST到localhos

  • 问题内容: 我有一堂课: 然后,我有了另一个主要功能,其中有一个功能,必须根据年份过滤该项目列表,并获得名称列表作为结果。 您能告诉我如何使用Java 8 Lambda表达式吗? 谢谢 问题答案: 好吧,您没有说明确切的过滤条件,但是假设您希望按给定年份过滤元素:

  • 我有一个返回部分列表的控制器。这些部分中的每一个都有一个类型。我想测试类型“JOB”的部分是否有一个大小为3的字段“函数”。 这是我的代码: 控制器返回的JSON(为便于阅读而简化): 我用这个工具对JSON进行了测试,结果正确,但在运行测试时,我得到了以下断言错误:

  • 第一篇文章是关于Stack的,对于使用Python和DynamoDB编程来说,这是相当新的,但是我只是想在我的表上运行一个扫描,根据两个预定义的属性返回结果。 ---这是我的Python代码片段--- 我的发电机有4个磁场。 ID 日期 班次 安全 现在关于这个问题,在运行时,我得到了两个返回的表条目,而我应该只得到第一个条目...根据我的扫描标准,有“没有安全问题”的那个。 ---这是我的Dyn