Ein Ansatz kam ich mit ein zufälliges Element aus einer DynamoDB Tabelle zu holen:
- Generieren eines Zufalls RangeKey über alle möglichen RangeKeys in Ihrer Tabelle
- Abfrage der Tabelle mit diesem RangeKey und der RangeKeyCondition GreaterThan und ein Limit von 1
zum Beispiel, wenn Sie einen UUID als Identifier verwenden für Ihre RangeKey Sie Ihre Zufallsgenerator wie folgt
bekommen konnte
RandomRangeKey = new UUID
RandomItem = Query("HashKeyValue": "KeyOfRandomItems",
"RangeKeyCondition": { "AttributeValueList":
"RandomRangeKey",
"ComparisonOperator":"GT"},
"Limit": 1)
So erhalten Sie einen zufälligen Artikel und verbrauchen nur 1 Lesekapazität.
Es besteht die Möglichkeit, die erste Abfrage nach einer Zufallsvariablen zu verpassen, indem eine kleinere UUID als die kleinste in der Tabelle verwendete Abfrage generiert wird. Diese Chance wird durch die Skalierung der Tabelle reduziert und Sie können problemlos eine weitere Anfrage mit dem SmallerThan-Vergleich auf demselben Zufallsschlüssel senden, der dann einen Treffer für ein zufälliges Objekt gewährleistet.
Wenn Ihr Tabledesign nicht randomizable RangeKeys ermöglicht es Ihnen, Ihren Ansatz folgen können und eine separate RandomItem Tabelle und speichern Sie die ID unter einem randomizable RangeKey erstellen. Eine mögliche Tabellenstruktur hierfür wäre
*RandomItemTable
TableName - HashKey
UUID - Rangekey
ItemId
Denken Sie daran, für diesen Ansatz müssen Sie die Redundanz zwischen der ursprünglichen Tabelle und der Randomisierungstabelle verwalten.
Danke für dieses nenTi - ich werde mir das anschauen. Ich muss zugeben, dass ich nicht über dachte einen GT Vergleichsoperator auf einer UUID mit - nette Idee :) – ben
DynamoDB Abfrage muss eine Hash-Schlüssel angeben. Die obige Antwort funktioniert, wenn Sie eine zufällige Zeile für einen bestimmten Hash-Schlüssel erhalten möchten. wenn Sie eine ‚globale‘ Zufallsgenerator erhalten wollen, dann wird es nicht :( –