DynamoDBテーブルからランダムにアイテム/レコードを選択する方法はありますか?APIにこれに関する規定はないと思います。
NumericId | MyOtherKey( "NumericIdTable")のテーブルを維持し、0からレコードの総数までの乱数を生成し、そのアイテムをNumericIdTableから取得することを考えましたが、長期的には機能しません。
考え/アイデアを歓迎します。
DynamoDBテーブルからランダムにアイテム/レコードを選択する方法はありますか?APIにこれに関する規定はないと思います。
NumericId | MyOtherKey( "NumericIdTable")のテーブルを維持し、0からレコードの総数までの乱数を生成し、そのアイテムをNumericIdTableから取得することを考えましたが、長期的には機能しません。
考え/アイデアを歓迎します。
DynamoDB テーブルからランダムな項目を選択するために私が思いついた 1 つのアプローチ:
たとえば、RangeKey の識別子として UUID を使用すると、次のようなランダムなアイテムを取得できます。
RandomRangeKey = new UUID
RandomItem = Query( "HashKeyValue": "KeyOfRandomItems",
"RangeKeyCondition": { "AttributeValueList":
"RandomRangeKey",
"ComparisonOperator":"GT"},
"Limit": 1 )
このようにして、ランダムなアイテムを取得し、読み取り容量を 1 つだけ消費します。
テーブルで使用されている最小の UUID よりも小さい UUID を生成することにより、確率変数の最初のクエリを見逃す可能性があります。このチャンスは、テーブルが拡大するにつれて縮小し、同じランダム キーで SmallerThan 比較を使用して別のリクエストを簡単に送信できます。これにより、ランダム アイテムのヒットが保証されます。
Tabledesign でランダム化可能な RangeKeys が許可されていない場合は、アプローチに従って別の RandomItem テーブルを作成し、ランダム化可能な RangeKey の下に ID を格納できます。このための可能なテーブル構造は次のようになります
*RandomItemTable
TableName - HashKey
UUID - Rangekey
ItemId
このアプローチでは、元のテーブルとランダム化テーブルの間の冗長性を管理する必要があることに注意してください。
ユースケースによっては、次のアプローチをお勧めします。
すべての dynamodb テーブルをスキャンし、「pk」と「sk」を別のファイルに保存するスクリプトを作成します。
すべての "pk" と "sk" のペアをラムダ レイヤーにローカル依存関係として保存します (nodejs を使用する場合は、「package.json のローカル依存関係」を検索してください)。
ラムダでローカル依存関係をインポートし、ランダムな項目を選択します。
スクリプトを定期的に実行して、ローカルの依存関係にある「pk」と「sk」の更新セットを取得します。
非常に巨大なdynamodbテーブルがなく、新しい「pk」と「sk」を頻繁に含める必要がない場合は、このアプローチで十分だと思います。