web-dev-qa-db-fra.com

Requête pour la plus grande valeur de la clé Range sur AWS DynamoDb

Quel est l’équivalent DynamoDB de

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

Le mieux que je puisse trouver est

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]

Y a-t-il une meilleure manière de faire cela?

17
Vishal

C'est la bonne façon. 

Étant donné que les enregistrements appariés par la clé de hachage sont triés par la clé de plage, obtenir le premier par ordre de descendance vous donnera l'enregistrement avec la clé de plage maximale.

Les résultats de la requête sont toujours triés par la clé d'intervalle. Si le type de données de La clé d'intervalle est Number, les résultats sont renvoyés dans l'ordre numérique; Sinon, les résultats sont renvoyés dans l'ordre de ASCII code de caractère valeurs. Par défaut, l'ordre de tri est croissant. Pour inverser l'ordre , Utilisez le paramètre ScanIndexForward défini sur false.

Opérations de requête et d'analyse - Amazon DynamoDB: http://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html

REMARQUE: Définir le paramètre reverse sur true via l'API boto équivaut à définir ScanIndexForward sur false via l'API AWS native.

11
bsd

Si quelqu'un cherche comment faire avec Java:

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

Dans boto3, vous pouvez le faire de cette façon:

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) 

output contient la ligne associée à la valeur Max pour la plage comprise entre début et fin. Pour la valeur Min, remplacez ScanIndexForward par True

0
abedfar