0

J'utilise dynamoDb pour stocker quelques informations supplémentaires, mais j'ai quelques problèmes de tri de mes données.DynamoDB trier les données avec la clé de tri ne fonctionne pas

J'ai la syntaxe de création suivante où j'ai une storeId et number touches. J'ai mis le number comme clé de tri, mais le problème est que les données ne sont pas triées du tout.

$response = $dynamoDb->createTable([ 
    'TableName' => 'foo', 
    'KeySchema' => [ 
     [ 
      'AttributeName' => 'storeId', 
      'KeyType' => 'HASH' //Partition key 
     ], 
     [ 
      'AttributeName' => 'number', 
      'KeyType' => 'RANGE' // sort Key 
     ] 
    ], 
    'AttributeDefinitions' => [ 
     [ 
      'AttributeName' => 'storeId', 
      'AttributeType' => 'N' 
     ], 
     [ 
      'AttributeName' => 'number', 
      'AttributeType' => 'N' 
     ] 
    ], 
    'ProvisionedThroughput' => [ 
     'ReadCapacityUnits' => 20, 
     'WriteCapacityUnits' => 20 
    ] 
]); 

Mon analyse params:

$scanParams = [ 
    'TableName' => 'foo', 
    'ProjectionExpression' => '#storeId, #number', 
    'FilterExpression' => '#number >= :n', 
    'ExpressionAttributeNames'=> [ '#storeId' => 'storeId', '#number' => 'number'], 
    'ExpressionAttributeValues' => [ 
     ':n' => ['N' => $number] 
    ] 
]; 

Le résultat de mon analyse:

StoreId number 
68001 80000 
25000 37000 
463501 527000 
4800001 5300000 
360001 400000 
2000001 2600000 

Comme vous pouvez le voir, les données ne sont pas triées sur la propriété du numéro.

+0

Vous ne pouvez obtenir des résultats triés que sur une requête, pas une analyse. Et pour la requête, vous devez fournir la valeur 'storeId'. Essentiellement, vous pouvez seulement obtenir les résultats triés d'une partition, pas la table entière. – idbehold

+0

@idbehold Je ne connais que la valeur de la clé de tri, donc pas la 'storeId' et les deux touches doit être spécifiée dans la requête – user3601546

Répondre

0

Il vous suffit de lire le premier paragraphe ci-dessous. La clé de tri est utilisée pour stocker physiquement tous les éléments de la même valeur de clé de partition et les trier par ordre croissant par défaut (c'est-à-dire que les données ne sont pas triées sur la clé de partition). En d'autres termes, les données sont triées par ordre croissant par défaut pour la même clé de partition.

Exemple: -

Partition clé Sort Key

p1, s1

p1, s2

p1, s3

p2, s1

p2, s2

Si la table a une clé primaire composite (clé de partition et clé de tri), DynamoDB calcule la valeur de hachage de la clé de partition de la même comme décrit dans la distribution des données: Partition clé -mais il stocke tous les éléments des éléments ayant la même valeur de clé de partition physiquement proches , classés par valeur de clé de tri.

Pour écrire un élément dans la table, DynamoDB calcule la valeur de hachage de la clé de partition pour déterminer quelle partition doit contenir l'élément . Dans cette partition, il peut y avoir plusieurs éléments avec la même valeur de clé de partition , donc DynamoDB stocke l'élément parmi les autres avec la même clé de partition, dans l'ordre croissant par clé de tri.

Pour lire un élément de la table, vous devez spécifier sa valeur de clé de partition et la valeur de clé de tri. DynamoDB calcule la valeur de hachage de la clé de partition, ce qui donne la partition dans laquelle l'élément peut être trouvé.

Dans l'API de requête, un paramètre permet d'obtenir le résultat dans l'ordre croissant ou décroissant.

ScanIndexForward: true || false 

ScanIndexForward - (Boolean)

Indique l'ordre pour traversal index: Si true (par défaut), le traversal est effectuée dans l'ordre croissant; si faux, la traversée est effectuée dans l'ordre décroissant.

articles avec la même valeur de clé de partition sont stockés dans l'ordre de tri par clé de tri. Si le type de données de clé de tri est Number, les résultats sont stockés dans un ordre numérique. Pour le type chaîne, les résultats sont stockés dans l'ordre des valeurs de code de caractères ASCII. Pour le type binaire, DynamoDB traite chaque octet des données binaires comme non signé.

Si ScanIndexForward est vrai, DynamoDB renvoie les résultats dans l'ordre dans lequel elles sont stockées (par valeur clé de tri). Ceci est le comportement par défaut. Si ScanIndexForward est faux, DynamoDB lit les résultats dans l'ordre inverse de la valeur clé de tri, puis renvoie les résultats au client.

Query API

+0

Et comment puis-je lire un article quand je ne connais que le genre valeur de clé, et non la partition clé? – user3601546

+0

Deux options. 1) utiliser l'API de balayage pour balayer toute la table avec l'expression de filtre (balayage de note est une opération coûteuse). 2) Créer GSI avec la clé de tri de la table principale en tant que clé de partition de l'index. – notionquest