web-dev-qa-db-fra.com

Est-il possible de COMMANDER des résultats avec une requête ou une analyse dans DynamoDB?

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.

64
Samuel Negru

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.

38
Steffen Opel

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));
    }
});
18
kometen

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());
    }
}
6
ABHAY JOHRI

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.

1
pilatipus

Une autre option qui devrait résoudre le problème est de

  1. Définissez un secondaire secondaire local avec la clé de hachage "normale" comme clé de hachage du LSI
  2. Définissez le champ que vous souhaitez trier en tant que "clé de tri" du LSI
  3. Interrogez le LSI et définissez l'ordre souhaité (voir ci-dessus).

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.

1
Geole