Un enfoque que se le ocurrió a escoger un artículo al azar de una tabla DynamoDB:
- generar un RangeKey azar en todas las RangeKeys posibles en su tabla
- consultar la tabla con este RangeKey y la RangeKeyCondition MayorQue y un límite de 1
por ejemplo, si utiliza un UUID como identificador para su RangeKey usted podría conseguir su artículo al azar como la siguiente
RandomRangeKey = new UUID
RandomItem = Query("HashKeyValue": "KeyOfRandomItems",
"RangeKeyCondition": { "AttributeValueList":
"RandomRangeKey",
"ComparisonOperator":"GT"},
"Limit": 1)
De esta forma se obtiene un elemento aleatorio y solo consume 1 capacidad de lectura.
Existe la posibilidad de perder la primera consulta de una variable aleatoria al generar un UUID más pequeño que el más pequeño utilizado en la tabla. Esta posibilidad se reduce con la escala de la tabla y puede enviar fácilmente otra solicitud utilizando la Comparación más pequeña de Than en la misma clave aleatoria, que luego asegura un golpe para un elemento aleatorio.
Si su Tabledesign no permite RangeKeys randomizable que podrían seguir su enfoque y crear una tabla RandomItem independiente y almacenar el ID bajo un RangeKey randomizable. Una posible estructura de la tabla para esto sería
*RandomItemTable
TableName - HashKey
UUID - Rangekey
ItemId
tener en cuenta, para este enfoque que necesita para administrar la redundancia entre la tabla original y la tabla de asignación al azar.
Gracias por este nenTi - Voy a echar un vistazo a la implementación de esto. Debo admitir que no pensé en utilizar un operador de comparación GT en un UUID - buena idea :) – ben
La consulta DynamoDB necesita especificar una clave hash. la respuesta anterior funcionará si desea obtener una fila aleatoria para una clave hash específica. si desea obtener un elemento aleatorio 'global', entonces no funcionará :( –