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?
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.
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);
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