31

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 の使用に戻ると、この場合、結果の終わりに達したかどうかを知るにはどうすればよいでしょうか。

4

1 に答える 1

59

には、希望する方向に応じて、いくつかの異なるオプションがありますDynamoDBMapper

ここで重要なのは、メソッド間の違いと、返されたオブジェクトがカプセル化する機能を理解することです。

と について説明しますがPaginatedScanListScanResultPageこれらのメソッド/オブジェクトは基本的に相互にミラーリングされています。

次のPaginatedScanListように述べています。

AWS DynamoDB でのスキャンの結果を表す List インターフェイスの実装。ページ分割された結果は、ユーザーがそれらを必要とする操作を実行すると、オンデマンドで読み込まれます。size() などの一部の操作では、リスト全体をフェッチする必要がありますが、可能な場合、結果はページごとに遅延フェッチされます。

これは、リストを反復処理するときに結果が読み込まれることを示しています。最初のページを通過すると、別のリクエストを明示的に行わなくても、2 番目のページが自動的に取得されます。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
于 2015-09-26T18:04:16.960 に答える