web-dev-qa-db-ja.com

rails)でAmazon DynamoDBを使用するときにページネーションを実装する方法

RailsでAmazonDynamo DBを使用したいのですが、ページネーションを実装する方法が見つかりません。

私が使用します AWS::Record::HashModelORMとして。

このORMは、次のような制限をサポートしています。

People.limit(10).each {|person| ... } 

しかし、DynamoDBで次のMySqlクエリを実装する方法を理解できませんでした。

SELECT * 
  FROM  `People` 
 LIMIT 1 , 30
18
sunil

LIMITを使用してクエリを発行します。返されるサブセットに完全なテーブルが含まれていない場合は、「LastEvaluatedKey」値が返されます。この値を次のクエリのExclusiveStartKeyとして使用します。等々...

DynamoDB開発者ガイド から。

30
codeprimate

クエリで「page-size」を指定して、結果セットのサイズを設定できます。 DynamoDBの応答には、ページサイズごとに最後のキーを示す「LastEvaluatedKey」が含まれています。応答に「LastEvaluatedKey」が含まれていない場合は、フェッチする結果が残っていないことを意味します。次回のフェッチ時に、「LastEvaluatedKey」を「ExclusiveStartKey」として使用します。

これがお役に立てば幸いです。

DynamoDBページネーション

2
Pranav Patil

私も同様の問題に直面しました。

一般的なページ付けアプローチは、「開始インデックス」または「開始ページ」と「ページ長」を使用することです。

「ExclusiveStartKey」および「LastEvaluatedKey」ベースのアプローチは、DynamoDBに非常に固有です。

このDynamoDB固有のページネーションの実装は、APIクライアント/ UIから隠す必要があると思います。

また、アプリケーションがサーバーレスの場合、Lambdaなどのサービスを使用すると、サーバー上の状態を維持できなくなります。反対側は、クライアントの実装が非常に複雑になることです。

私は別のアプローチを採用しましたが、これは一般的だと思います(DynamoDBに固有ではありません)

APIクライアントが開始インデックスを指定する場合、テーブルからすべてのキーをフェッチして配列に格納します。

クライアントによって指定された配列から開始インデックスのキーを見つけます。

ExclusiveStartKeyを利用して、ページ長で指定されたレコード数をフェッチします。

開始インデックスパラメータが存在しない場合、上記の手順は必要ありません。スキャン操作でExclusiveStartKeyを指定する必要はありません。

このソリューションにはいくつかの欠点があります-

ユーザーが開始インデックスでページ付けする必要がある場合は、すべてのキーをフェッチする必要があります。

IDとインデックスを保存するために追加のメモリが必要になります。追加のデータベーススキャン操作(キーをフェッチするための1つまたは複数)

しかし、これは私たちのAPIを使用しているクライアントにとって非常に簡単なアプローチになると思います。後方スキャンはシームレスに機能します。ユーザーが「n番目」のページを見たい場合、これは可能です。

0
Dattatray