Est-il possible de COMMANDER les résultats avec l'API de requête ou d'analyse dans DynamoDB?
J'ai besoin de savoir si DynamoDB a quelque chose comme [ORDER BY 'field'] à partir de requêtes SQL?
Merci.
Toutefois, il n'est évidemment pas nécessaire de commander pour de nombreux cas d'utilisation réels et il est donc possible de modéliser à l'aide de clé primaire de hachage et de type de plage en conséquence:
Dans ce cas, la clé primaire est composée de deux attributs. Le premier attribut est l'attribut hash et le second l'attribut range. Amazon DynamoDB crée un index de hachage non ordonné sur l'attribut de clé primaire de hachage et un index de plage trié sur l'attribut de clé primaire de plage . [italiques]
Vous pouvez ensuite utiliser cet index pour éventuellement demander des éléments via le paramètre RangeKeyCondition de API de requête et spécifier le parcours en avant ou en arrière de l'index (le sens du tri) via le paramètre ScanIndexForward.
Mise à jour: Vous pouvez commander par un attribut avec un index secondaire local de la même manière.
Vous pouvez utiliser la clé de tri et appliquer le paramètre ScanIndexForward dans une requête requête pour trier par ordre croissant ou décroissant. Ici, je limite les articles retournés à 1.
var params = {
TableName: 'Events',
KeyConditionExpression: 'Organizer = :organizer',
Limit: 1,
ScanIndexForward: false, // true = ascending, false = descending
ExpressionAttributeValues: {
':organizer': organizer
}
};
docClient.query(params, function(err, data) {
if (err) {
console.log(JSON.stringify(err, null, 2));
} else {
console.log(JSON.stringify(data, null, 2));
}
});
Utilisez ScanIndexForward (true pour ascendant et false pour décroissant) et pouvez également limiter le résultat à l'aide de la valeur setLimit de l'expression de requête.
Veuillez trouver ci-dessous le code où QueryPage a été utilisé pour trouver un seul enregistrement.
public void fetchLatestEvents() {
EventLogEntitySave entity = new EventLogEntitySave();
entity.setId("1C6RR7JM0JS100037_contentManagementActionComplete");
DynamoDBQueryExpression<EventLogEntitySave> queryExpression = new DynamoDBQueryExpression<EventLogEntitySave>().withHashKeyValues(entity);
queryExpression.setScanIndexForward(false);
queryExpression.withLimit(1);
queryExpression.setLimit(1);
List<EventLogEntitySave> result = dynamoDBMapper.queryPage(EventLogEntitySave.class, queryExpression).getResults();
System.out.println("size of records = "+result.size() );
}
@DynamoDBTable(tableName = "PROD_EA_Test")
public class EventLogEntitySave {
@DynamoDBHashKey
private String id;
private String reconciliationProcessId;
private String vin;
private String source;
}
public class DynamoDBConfig {
@Bean
public AmazonDynamoDB amazonDynamoDB() {
String accesskey = "";
String secretkey = "";
//
// creating dynamo client
BasicAWSCredentials credentials = new BasicAWSCredentials(accesskey, secretkey);
AmazonDynamoDB dynamo = new AmazonDynamoDBClient(credentials);
dynamo.setRegion(Region.getRegion(Regions.US_WEST_2));
return dynamo;
}
@Bean
public DynamoDBMapper dynamoDBMapper() {
return new DynamoDBMapper(amazonDynamoDB());
}
}
Si vous utilisez boto2 et que vous avez la clé de tri sur l'une des colonnes de votre table, vous pouvez trier ce que vous récupérez dans l'ordre ou dans l'ordre inverse en disant:
result = users.query_2(
account_type__eq='standard_user',
reverse=True)
Si vous utilisez boto et que vous avez la clé de tri sur la colonne par laquelle vous voulez trier le résultat, vous pouvez trier les données que vous récupérez en disant:
result = users.query(
KeyConditionExpression=Key('account_type').eq('standard_user'),
ScanIndexForward=True)
Rappelez-vous dans boto3 si ScanIndexForward est vrai, DynamoDB renvoie les résultats dans l'ordre dans lequel ils sont stockés (par la valeur de la clé de tri). Ceci est le comportement par défaut. Si ScanIndexForward a la valeur false, DynamoDB lit les résultats dans l'ordre inverse de la valeur de la clé de tri, puis renvoie les résultats au client.
Une autre option qui devrait résoudre le problème est de
Cela permettra de trier toute valeur de votre table selon vos besoins. C'est un moyen très efficace de rechercher les éléments les mieux classés dans votre table sans avoir à extraire la requête entière, puis à la filtrer.