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 Comparisonを使用して別のリクエストを簡単に送信できます。これにより、ランダムアイテムが確実にヒットします。
Tabledesignでランダム化可能なRangeKeyが許可されていない場合は、アプローチに従って別のRandomItemテーブルを作成し、ランダム化可能なRangeKeyの下にIDを格納できます。このための可能なテーブル構造は次のようになります
*RandomItemTable
TableName - HashKey
UUID - Rangekey
ItemId
このアプローチでは、元のテーブルとランダム化テーブルの間の冗長性を管理する必要があることに注意してください。
テーブルのハッシュキーとしてGUIDを使用している場合は、次のように実行できます。
var client = new AmazonDynamoDBClient();
var lastKeyEvaluated = new Dictionary<string, AttributeValue>()
{
{ "YOUR_HASH_KEY", new AttributeValue(Guid.NewGuid().ToString()) }
};
var request = new ScanRequest()
{
TableName = YOUR_TABLE_NAME,
ExclusiveStartKey = lastKeyEvaluated,
Limit = 1
};
var response = client.Scan(request);
これにより、lastKeyEvaluatedとしてランダムなGUIDが生成されるため、毎回ランダムなレコードが得られます。
単純な方法は、1)describe table callを使用してこのテーブルのN(行の総数)を取得する2)1からNの間の乱数iを選択する3)スキャンすることです。 i行が表示されるまで停止します
私はこれを行うためのより良い方法を考えています。良い答えがありましたら更新します。
これを行う簡単で効果的な方法の1つ:
ProjectionExpression
を使用してのみプライマリパーティションキーを取得します。