query nodejs filterexpression example dynamodb documentclient boto amazon-dynamodb

boto - nodejs - Buscando el mayor valor de la clave Range en AWS DynamoDb



dynamodb query nodejs (3)

En boto3 puedes hacerlo de esta manera:

import boto3 from boto3.dynamodb.conditions import Key, Attr kce = Key(''table_id'').eq(tableId) & Key(''range'').between(start, end) output = table.query(KeyConditionExpression = kce, ScanIndexForward = False, Limit = 1)

la salida contiene la fila asociada con el valor máximo para el rango entre el inicio y el final. Para el valor mínimo, cambie el ScanIndexForward a True

¿Cuál es el equivalente de DynamoDB de

SELECT MAX(RANGE_KEY) FROM MYTABLE WHERE PRIMARYKEY = "value"

Lo mejor que se me ocurre es

from boto.dynamodb2.table import Table as awsTable tb = awsTable("MYTABLE") rs = list(tb.query_2(PRIMARYKEY__eq="value", reverse=True, limit=1)) MAXVALUE = rs[0][RANGE_KEY]

¿Hay una mejor manera de hacer esto?


Esa es la forma correcta.

Debido a que los registros que coinciden con la clave de hash están ordenados por la clave de rango, obtener el primero por orden descendiente le dará el registro con la clave de rango máximo.

Los resultados de la consulta siempre se ordenan por la clave de rango. Si el tipo de datos de la clave de rango es Número, los resultados se devuelven en orden numérico; de lo contrario, los resultados se devuelven en orden de los valores del código de caracteres ASCII. Por defecto, el orden de clasificación es ascendente. Para invertir el orden, use el parámetro ScanIndexForward establecido en falso.

Operaciones de consulta y exploración: Amazon DynamoDB: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html

NOTA: establecer el parámetro de reverse en verdadero a través de la API de boto es equivalente a configurar ScanIndexForward en falso a través de la API de AWS nativa.


Si alguien busca cómo hacerlo con Java:

QuerySpec querySpec = new QuerySpec(); querySpec.withKeyConditionExpression("PRIMARYKEY = :key") .withValueMap(new ValueMap() .withString(":key", primaryKeyValue)); querySpec.withScanIndexForward(true); querySpec.withMaxResultSize(1);