web-dev-qa-db-fra.com

DynamoDB: l'élément de clé fourni ne correspond pas au schéma

Existe-t-il un moyen d'obtenir un élément dépendant d'un champ autre que le hashkey?

Exemple

Mes utilisateurs de la table: id (HashKey), name, email

Et je veux récupérer l'utilisateur ayant un email en tant que '[email protected]'

Comment cela peut être fait?

J'essaye ça avec boto:

user = users.get_item(email='[email protected]')

Je reçois l'erreur suivante: 

'The provided key element does not match the schema'
26
Houssam Hsm

Pour interroger des champs qui ne sont pas la clé de hachage, vous devez utiliser un index secondaire global (GSI). Jetez un coup d'œil à ce message AWS pour plus de détails sur les GSI. 

UPDATE Feb 2015: Il est maintenant possible d'ajouter un GSI à une table existante. Voir Amazon Docs pour plus de détails.

Malheureusement vous ne pouvez pas ajouter un fichier GSI à une table DynamoDB existante , vous devez donc créer une nouvelle table et porter vos données si vous souhaitez vraiment interroger cette fonction.

Depuis le DynamoDB FAQ }:

Q: Comment créer un index secondaire global pour une table DynamoDB?

Tous les GSI associés à une table doivent être spécifiés lors de la création de la table temps. Pour le moment, il n’est pas possible d’ajouter un GSI après la table a été créé. Pour les étapes détaillées de la création d’une table et de ses index, voir ici . Vous pouvez créer un maximum de 5 index secondaires globaux .__ } par table . </ s>

Si vous ne souhaitez pas porter vos données, vous pouvez envisager de créer une deuxième table DynamoDB avec le courrier électronique en tant que clé de hachage et le hachage de l'enregistrement parent à utiliser comme recherche dans votre table de données principale. exactement une solution optimale et il vient avec ses propres maux de tête de le maintenir en phase avec votre table principale.

12
Wolfwyrd

Ce qui suit s'applique au SDK AWS Node.js dans l'environnement AWS Lambda:

Ce fut une dure pour moi. J'ai rencontré ce problème lorsque j'essayais d'utiliser la méthode getItem. Peu importe ce que j'ai essayé, je continuerais à recevoir cette erreur. J'ai finalement trouvé une solution sur le forum AWS: https://forums.aws.Amazon.com/thread.jspa?threadID=208820

De manière inexplicable, la solution apparente est en conflit avec toute la documentation AWS que je peux trouver.

Voici le code qui a fonctionné pour moi:

var doc = require('dynamodb-doc');
var dynamo = new doc.DynamoDB();

var params = { }
params.TableName = "ExampleTable";
var key = { "ExampleHashKey": "1" };
params.Key = key;

dynamo.getItem(params, function(err, data) {
    if (err)
        console.log(err);
    else
        console.log(data)
});
18
Sean

J'ai aussi eu cette erreur quand j'envoyais une chaîne au lieu d'un entier.

Bien sûr, c’était à ce moment-là que j’écrivais dans la base de données plutôt que de lire.

8
NotoriousWebmaster

J'ai eu cette erreur en Java parce que j'avais utilisé l'annotation @DynamoDBHashKey pour une clé RANGE. J'ai dû utiliser l'annotation @DynamoDBRangeKey pour l'identifiant de mon objet.

0