在 AWS DynamoDB 中实现偏移和限制的最简单方法是什么?

What is the easiest way to implement offset and limit in AWS DynamoDB?

我目前正在使用 DynamoDB,我发现没有内置函数可以像 SQL 查询那样放置偏移量和限制。我唯一看到的是获取 lastEvaluatedKey 并作为 exclusiveStartKey 传递。但我的问题是根据我们的场景,我们无法获取 lastEvaluatedKey 并填充,因为我们是 sorting 数据和 parallel-stream 数据。

所以会有问题和难点。我只需要知道什么是干净的方法,或者有什么最好的方法可以传递偏移量和限制并获取数据而无需遍历所有数据。因为现在即使 bound-iterator 有偏移量和限制,它也在内部获取并迭代 DynamoDB 中的所有数据,即使我们不需要其他数据也会消耗大量读取容量。

Map<String, AttributeValue> valueMap = new HashMap<>();
valueMap.put(":v1", new AttributeValue().withS(id));

Map<String, String> nameMap = new HashMap<>();
nameMap.put("#PK", "PK");

DynamoDBQueryExpression<TestClass> expression = new DynamoDBQueryExpression<TestClass>()
.withKeyConditionExpression("#PK = :v1")
.withExpressionAttributeNames(nameMap)
.withExpressionAttributeValues(valueMap)
.withConsistentRead(false);

PaginatedQueryList<TestClass> testList = dynamoDBMapper.query(TestClass.class, expression);
Iterator<TestClass> iterator = IteratorUtils.boundedIterator(testList.iterator(), offset, limit);
return IteratorUtils.toList(iterator);

处理此问题的最佳方法是什么?

一个 Query 请求有一个 Limit 选项,就像您想要的那样。至于偏移量,您有 ExclusiveStartKey 选项,它表示您要从长分区内的哪个排序键开始。尽管通过将 ExclusiveStartKey 设置为上一页的 LastEvaluatedKey 通常 通过长分区翻一页,但严格来说您不需要这样做,实际上可以传递任何现有的甚至不存在的项目,查询将在 那个键之后开始(这就是 exclusive 这个词的意思,即,它不包括)。

但是当您说“偏移量”时,您可能指的是数字偏移量 - 例如,从分区中的第 1000 个项目开始。不幸的是,DynamoDB 不支持。如果您的排序键(或 LSI 键)是项目的数字偏移量(仅当您仅附加到分区时才实用......)或使用一些额外的数据结构,您可以对其进行近似,但 DynamoDB 本身不支持它。