gpt4 book ai didi

amazon-web-services - 使用 DynamoDBMapper Java AWS SDK 进行分页

转载 作者:行者123 更新时间:2023-12-03 21:11:08 25 4
gpt4 key购买 nike

从 API docs dynamo db 确实支持扫描和查询操作的分页。这里的问题是设置 ExclusiveStartIndex当前请求的值 LastEvaluatedIndex获取下一组(逻辑页)结果的先前请求。

我正在尝试实现相同的功能,但我正在使用 DynamoDBMapper ,这似乎具有更多优势,例如与数据模型的紧密耦合。因此,如果我想执行上述操作,我假设我会执行以下操作:

// Mapping of hashkey of the last item in previous query operation
Map<String, AttributeValue> lastHashKey = ..
DynamoDBQueryExpression expression = new DynamoDBQueryExpression();

...
expression.setExclusiveStartKey();
List<Table> nextPageResults = mapper.query(Table.class, expression);

我希望我的上述理解在使用 DynamoDBMapper 进行分页时是正确的。
其次,我怎么知道我已经到了结果的尽头。如果我使用以下 api,则来自文档:

QueryResult result = dynamoDBClient.query((QueryRequest) request);
boolean isEndOfResults = StringUtils.isEmpty(result.getLastEvaluatedKey());

回到使用 DynamoDBMapper 的问题上,在这种情况下我怎么知道我是否达到了结果。

最佳答案

DynamoDBMapper 有几个不同的选择,这取决于你想走哪条路。

  • query - 返回 PaginatedQueryList
  • queryPage - 返回 QueryResultPage
  • scan - 返回 PaginatedScanList
  • scanPage - 返回 ScanResultPage

  • 这里的部分是理解方法之间的区别,以及它们返回的对象封装了什么功能。
    我过去 PaginatedScanListScanResultPage ,但这些方法/对象基本上是相互镜像的。 PaginatedScanList说以下,强调我的:

    Implementation of the List interface that represents the results from a scan in AWS DynamoDB. Paginated results are loaded on demand when the user executes an operation that requires them. Some operations, such as size(), must fetch the entire list, but results are lazily fetched page by page when possible.


    这表示在您遍历列表时会加载结果。当您浏览第一页时,第二页会自动获取,您无需明确发出另一个请求。延迟加载结果是默认方法,但如果您调用重载方法并提供 DynamoDBMapperConfig,则可以覆盖它。与不同的 DynamoDBMapperConfig.PaginationLoadingStrategy .
    这与 ScanResultPage不同.您将获得一页结果,由您自己处理分页。
    以下是快速代码示例,显示了我使用 DynamoDBLocal 对包含 5 个项目的表运行的两种方法的示例用法:
    final DynamoDBMapper mapper = new DynamoDBMapper(client);

    // Using 'PaginatedScanList'
    final DynamoDBScanExpression paginatedScanListExpression = new DynamoDBScanExpression()
    .withLimit(limit);
    final PaginatedScanList<MyClass> paginatedList = mapper.scan(MyClass.class, paginatedScanListExpression);
    paginatedList.forEach(System.out::println);

    System.out.println();
    // using 'ScanResultPage'
    final DynamoDBScanExpression scanPageExpression = new DynamoDBScanExpression()
    .withLimit(limit);
    do {
    ScanResultPage<MyClass> scanPage = mapper.scanPage(MyClass.class, scanPageExpression);
    scanPage.getResults().forEach(System.out::println);
    System.out.println("LastEvaluatedKey=" + scanPage.getLastEvaluatedKey());
    scanPageExpression.setExclusiveStartKey(scanPage.getLastEvaluatedKey());

    } while (scanPageExpression.getExclusiveStartKey() != null);
    和输出:
    MyClass{hash=2}
    MyClass{hash=1}
    MyClass{hash=3}
    MyClass{hash=0}
    MyClass{hash=4}

    MyClass{hash=2}
    MyClass{hash=1}
    LastEvaluatedKey={hash={N: 1,}}
    MyClass{hash=3}
    MyClass{hash=0}
    LastEvaluatedKey={hash={N: 0,}}
    MyClass{hash=4}
    LastEvaluatedKey=null

    关于amazon-web-services - 使用 DynamoDBMapper Java AWS SDK 进行分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32788959/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com