RailsでAmazonDynamo DBを使用したいのですが、ページネーションを実装する方法が見つかりません。
私が使用します AWS::Record::HashModel
ORMとして。
このORMは、次のような制限をサポートしています。
People.limit(10).each {|person| ... }
しかし、DynamoDBで次のMySqlクエリを実装する方法を理解できませんでした。
SELECT *
FROM `People`
LIMIT 1 , 30
LIMITを使用してクエリを発行します。返されるサブセットに完全なテーブルが含まれていない場合は、「LastEvaluatedKey」値が返されます。この値を次のクエリのExclusiveStartKeyとして使用します。等々...
DynamoDB開発者ガイド から。
クエリで「page-size」を指定して、結果セットのサイズを設定できます。 DynamoDBの応答には、ページサイズごとに最後のキーを示す「LastEvaluatedKey」が含まれています。応答に「LastEvaluatedKey」が含まれていない場合は、フェッチする結果が残っていないことを意味します。次回のフェッチ時に、「LastEvaluatedKey」を「ExclusiveStartKey」として使用します。
これがお役に立てば幸いです。
私も同様の問題に直面しました。
一般的なページ付けアプローチは、「開始インデックス」または「開始ページ」と「ページ長」を使用することです。
「ExclusiveStartKey」および「LastEvaluatedKey」ベースのアプローチは、DynamoDBに非常に固有です。
このDynamoDB固有のページネーションの実装は、APIクライアント/ UIから隠す必要があると思います。
また、アプリケーションがサーバーレスの場合、Lambdaなどのサービスを使用すると、サーバー上の状態を維持できなくなります。反対側は、クライアントの実装が非常に複雑になることです。
私は別のアプローチを採用しましたが、これは一般的だと思います(DynamoDBに固有ではありません)
APIクライアントが開始インデックスを指定する場合、テーブルからすべてのキーをフェッチして配列に格納します。
クライアントによって指定された配列から開始インデックスのキーを見つけます。
ExclusiveStartKeyを利用して、ページ長で指定されたレコード数をフェッチします。
開始インデックスパラメータが存在しない場合、上記の手順は必要ありません。スキャン操作でExclusiveStartKeyを指定する必要はありません。
このソリューションにはいくつかの欠点があります-
ユーザーが開始インデックスでページ付けする必要がある場合は、すべてのキーをフェッチする必要があります。
IDとインデックスを保存するために追加のメモリが必要になります。追加のデータベーススキャン操作(キーをフェッチするための1つまたは複数)
しかし、これは私たちのAPIを使用しているクライアントにとって非常に簡単なアプローチになると思います。後方スキャンはシームレスに機能します。ユーザーが「n番目」のページを見たい場合、これは可能です。