Un approccio che si avvicinò con quello di scegliere un elemento casuale da una tabella DynamoDB:
- generare un RangeKey casuale su tutte le possibili RangeKeys nell'Elenco
- interrogare la tabella con questo RangeKey e il RangeKeyCondition GreaterThan e un limite di 1
per esempio, se si utilizza un UUID come identificativo per la vostra RangeKey si potrebbe ottenere il vostro articolo a caso come la seguente
RandomRangeKey = new UUID
RandomItem = Query("HashKeyValue": "KeyOfRandomItems",
"RangeKeyCondition": { "AttributeValueList":
"RandomRangeKey",
"ComparisonOperator":"GT"},
"Limit": 1)
In questo modo si ottiene un articolo casuale e si consuma solo 1 capacità di lettura.
C'è una possibilità di perdere la prima query per una variabile casuale generando un UUID più piccolo rispetto a quello più piccolo utilizzato nella tabella. Questa possibilità si ridimensiona con il ridimensionamento della tabella e puoi facilmente inviare un'altra richiesta utilizzando il Confronto SmallerThan sulla stessa chiave casuale, che garantisce un colpo per un oggetto casuale.
Se il Tabledesign non consente RangeKeys randomizable si potrebbe seguire il vostro approccio e creare una tabella RandomItem separato e memorizzare l'ID sotto un RangeKey randomizable. Una possibile struttura della tabella per questo sarebbe
*RandomItemTable
TableName - HashKey
UUID - Rangekey
ItemId
tenere a mente, per questo approccio è necessario gestire la ridondanza tra la tabella originale e la tabella di randomizzazione.
Grazie per questo nenTi - cercherò di implementarlo. Devo ammettere che non ho pensato di utilizzare un operatore di confronto GT su un UUID - bella idea :) – ben
La query DynamoDB deve specificare una chiave hash. la risposta sopra funzionerà se si desidera ottenere una riga casuale per una chiave hash specifica. se vuoi ottenere un oggetto casuale "globale", allora non funzionerà :( –