我有一个要求,我需要使用过滤器扫描DynamoDB表,该过滤器允许我根据日期字段过滤表格中的文档。具体来说,过滤器需要返回lastAccessTime(非散列或范围键)字段在当前扫描和上次扫描之间的文档。该字段在DynamoDB上定义为字符串,在我的Java代码中,我按以下方式构建条件:
Condition betweenDateCondition = new Condition()
.withComparisonOperator(ComparisonOperator.BETWEEN.toString())
.withAttributeValueList(
new AttributeValue().withS(dateFormatter.print(getLastScanTime())),
new AttributeValue().withS(dateFormatter.print(getCurrentScanTime())));
Map<String, Condition> conditions = new HashMap<String, Condition>();
keyConditions.put("lastAccessTime", betweenDateCondition);
ScanRequest scanRequest = new ScanRequest()
.withTableName("myTable")
.withScanFilter(conditions)
.withLimit(itemLimit)
.withReturnConsumedCapacity(ReturnConsumedCapacity.TOTAL)
.withExclusiveStartKey(exclusiveStartKey)
.withTotalSegments(totalSegments)
.withSegment(segment);
ScanResult scanResult = ddbClient.scan(scanRequest);
然而,当我执行此操作时,我注意到过滤器似乎不能在相隔几个小时的扫描操作中返回相同的数据。显然,DynamoDB表上的数据只是添加,所以我希望只收到新增的内容。
文档确实在比较运算符的使用上花费了大量的文字,尤其是ComparisonOperator.BETWEEN和字符串日期,我没有发现类似的问题。
答案 0 :(得分:1)
Map<String, Condition> conditions = new HashMap<String, Condition>();
keyConditions.put("lastAccessTime", betweenDateCondition);
好像你不小心修改了另一张Map而不是你想要的那张,不确定这是不是问题,或者当你把它发布到StackOverflow时这只是一个错字。
答案 1 :(得分:0)
withLimit限制要扫描的项目数,而不是返回的项目数。使用延迟加载来限制扫描返回的结果。扫描总是读取整个表段