DynamoDB : La condition élément clé ne correspond pas au schéma
Est-il un moyen d'obtenir un article en fonction d'un champ qui n'est pas le hashkey?
Exemple
Ma Table Users: id (HashKey), name, email
Et je veux les afficher à l'utilisateur d'avoir des emails comme "[email protected]'
Comment cela peut être fait?
J'ai essayer avec les boto:
user = users.get_item(email='[email protected]')
J'obtiens l'erreur suivante:
'The provided key element does not match the schema'
Vous devez vous connecter pour publier un commentaire.
De s'interroger sur les champs qui ne sont pas la clé de hachage, vous devez utiliser un Index Secondaire Global (GSI). Jetez un oeil à cette AWS Post pour plus de détails sur de GSI.
Mise à JOUR de Février 2015: Il est maintenant possible d'ajouter un GSI à une table existante. Voir la Amazon Docs pour plus de détails.
Malheureusement vous ne pouvez pas ajouter un GSI à une table DynamoDB de sorte que vous aurez besoin pour créer une nouvelle table et le port de vos données, si c'est quelque chose que vous avez vraiment besoin de s'interroger sur.
De la DynamoDB FAQ:
Si vous ne voulez pas de port de vos données, vous pourriez envisager la création d'une deuxième table DynamoDB avec l'e-mail d'un algorithme de hachage de la clé et de la valeur de hachage de l'enregistrement parent pour l'utiliser comme une recherche dans votre principal tableau de données, mais comme vous pouvez l'imaginer, ce n'est pas exactement une solution optimale et il est livré avec ses propres maux de tête de le garder en synchronisation avec votre maître de la table.Ce qui suit s'applique à la Node.js AWS SDK AWS Lambda environnement:
Ce fut une période difficile pour moi. J'ai rencontré ce problème lors de l'utilisation de la méthode getItem. Peu importe ce que j'ai essayé, je voudrais continuer à recevoir ce message d'erreur. J'ai finalement trouvé une solution sur AWS forum: https://forums.aws.amazon.com/thread.jspa?threadID=208820
Inexplicablement, la solution apparente conflits avec toutes AWS documentation que j'ai pu trouver.
Voici le code qui a fonctionné pour moi:
var key = { "ExampleHashKey": { "S": "1" } }
), alors que le SDK s'attend à une normale objet javascript (par exemplevar key = { "ExampleHashKey": "1" }
). Ce fut aussi se passe pour leupdate
/updateItem
méthodeJ'ai aussi eu cette erreur quand j'ai été l'envoi d'un string au lieu d'un entier.
Bien sûr, c'était quand j'ai écrit à la base de données, plutôt que de lire à partir d'.
$model = ModelData::where('PartitionKey', (string)$SearchPartitionKey)->where('SortKey',(integer)$SearchSortKey)->get();
J'ai eu cette erreur en Java, car j'avais utilisé le
@DynamoDBHashKey
annotation pour une GAMME de clé. J'ai dû utiliser la@DynamoDBRangeKey
annotation pour mon identifiant d'objet à la place.J'ai eu cette erreur dans mon application Java, parce que j'ai accidentellement avait deux touches annoté (
@DynamoDBRangeKey
) dans ma classe DAO, quand il ne devrait l'être. J'ai changé le nouvel ajout de l'annotation @DynamoDBAttribute
, et que résolu.