Jedno podejście wymyśliłem aby wybrać losowy element z DynamoDB tabeli:
- wygenerować losowy RangeKey nad wszystkimi możliwymi RangeKeys w tabeli
- kwerendy tabeli z tym RangeKey i RangeKeyCondition GreaterThan i wysokości 1
na przykład, jeśli używasz UUID jako identyfikator dla RangeKey można uzyskać losowy przedmiot podobny do poniższego
RandomRangeKey = new UUID
RandomItem = Query("HashKeyValue": "KeyOfRandomItems",
"RangeKeyCondition": { "AttributeValueList":
"RandomRangeKey",
"ComparisonOperator":"GT"},
"Limit": 1)
W ten sposób otrzymasz losowy przedmiot i zużyjesz tylko 1 pojemność odczytu.
Istnieje szansa na pominięcie pierwszego zapytania dla zmiennej losowej poprzez wygenerowanie mniejszego identyfikatora UUID niż najmniejszego używanego w tabeli. Ta szansa zmniejsza się wraz ze wzrostem stołu i możesz łatwo wysłać kolejną prośbę, używając porównania SmallerThan na tym samym losowym klawiszu, który zapewnia trafienie losowemu przedmiotowi.
Jeśli Tabledesign nie pozwala randomizable RangeKeys można śledzić swoje podejście i utworzyć oddzielną tabelę RandomItem i przechowywać identyfikator pod randomizable RangeKey. Możliwym Struktura tabeli dla tego byłoby
*RandomItemTable
TableName - HashKey
UUID - Rangekey
ItemId
Pamiętaj, że dla tego podejścia trzeba zarządzać redundancję między oryginalnej tabeli i tabeli randomizacji.
Dzięki za to NENTi - przyjrzę się realizacji tego. Muszę przyznać, że nie myślałem o używaniu operatora porównywania GT na UUID - fajny pomysł :) – ben
Zapytanie DynamoDB musi określić klucz skrótu. powyższa odpowiedź zadziała, jeśli chcesz uzyskać losowy wiersz dla określonego klawisza skrótu. jeśli chcesz dostać "globalny" element losowy, to nie zadziała :( –