web-dev-qa-db-fra.com

Analyse Dynamodb dans l'ordre trié

Salut, j'ai une table dynamodb. Je veux que le service me renvoie tous les articles de ce tableau et l'ordre est en triant sur un attribut.

Dois-je créer un index secondaire global pour cela? Si tel est le cas, quelle devrait être la clé de hachage, quelle est la clé de plage? (Notez que la requête sur gsi doit spécifier un comparateur "EQ" sur la clé de hachage de GSI.)

Merci beaucoup!

Erben

37
Erben Mo

Si vous connaissez la HashKey, alors toute requête retournera les éléments triés par clé Range:

"Les résultats de la requête sont toujours triés par la clé de plage. Si le type de données de la clé de plage est Nombre, les résultats sont renvoyés dans l'ordre numérique; sinon, les résultats sont renvoyés dans l'ordre ASCII caractère de code. 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

Maintenant, si vous devez retourner "tous les articles", cela signifie une analyse. Je ne pense pas que vous puissiez commander les résultats d'une analyse.

Une autre option consiste à utiliser un GSI. (Exemple ici: https://stackoverflow.com/a/21786544/29591 ). Ici, vous voyez que le GSI ne contient que HashKey. Les résultats, je suppose, seront classés par ordre de cette clé (je n'ai pas encore vérifié cette partie dans un programme!)

19
Sony Kadavan

L'approche que j'ai suivie pour résoudre ce problème consiste à créer un indice secondaire global comme ci-dessous. Je ne sais pas si c'est la meilleure approche mais la publier si elle est utile à quelqu'un.

Hash Key                 | Range Key
------------------------------------
Date value of CreatedAt  | CreatedAt

Limitation imposée à l'utilisateur de l'API HTTP pour spécifier le nombre de jours pour récupérer les données, par défaut à 24 heures.

De cette façon, je peux toujours spécifier le HashKey comme jour de la date actuelle et RangeKey peut utiliser les opérateurs> et <lors de la récupération. De cette façon, les données sont également réparties sur plusieurs fragments.

5
Gireesh

À partir de maintenant la dynamoDB balayage ne peut pas vous renvoyer des résultats triés.

Vous devez utiliser un question avec un nouvel indice secondaire global (GSI) avec un champ de hachage et de plage. L'astuce consiste à utiliser un hashkey auquel est affectée la même valeur pour toutes les données de votre table.

Je recommande de créer un nouveau champ pour toutes les données et de l'appeler "État" et de définir la valeur sur "OK", ou quelque chose de similaire.

Ensuite, votre requête pour obtenir tous les résultats triés ressemblerait à ceci:

{
    TableName: "YourTable",
    IndexName: "Status-YourRange-index",
    KeyConditions: {
        Status: {
            ComparisonOperator: "EQ", 
            AttributeValueList: [ 
                "OK"
            ]
        }
    },
    ScanIndexForward: false
}

Les documents pour écrire des requêtes GSI se trouvent ici: http://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/GSI.html#GSI.Querying

0
Deemoe