Noms d'attributs d'expression dans DynamoDB - Amazon DynamoDB

Noms d'attributs d'expression dans DynamoDB

Un nom d'attribut d'expression est un espace réservé utilisé dans une expression Amazon DynamoDB à la place d'un nom d'attribut réel. Un nom d'attribut d'expression doit commencer par un signe « livre » (#) et être suivi d'un ou de plusieurs caractères alphanumériques.

Cette section présente plusieurs cas dans lesquels vous devez utiliser des noms d'attributs d'expression.

Note

Les exemples de cette section utilisent AWS Command Line Interface (AWS CLI). Pour obtenir des exemples de code spécifiques de langages de programmation, consultez Mise en route avec DynamoDB et les kits SDK AWS.

Mots réservés

Dans certains cas, vous pouvez avoir besoin d'écrire une expression contenant un nom d'attribut qui entre en conflit avec un mot réservé DynamoDB. (Pour obtenir la liste complète des mots réservés, consultez Mots réservés dans DynamoDB.)

Par exemple, l'exemple AWS CLI. suivant échouerait, car COMMENT est un mot réservé.

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "Comment"

Pour contourner cela, vous pouvez remplacer Comment par un nom d'attribut d'expression tel que #c. Le # (signe de la livre) est obligatoire et indique qu'il s'agit d'un espace réservé pour un nom d'attribut. L'exemple AWS CLI ressemblerait maintenant à ce qui suit.

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "#c" \ --expression-attribute-names '{"#c":"Comment"}'
Note

Si un nom d'attribut commence par un nombre ou contient un espace ou un mot réservé, vous devez utiliser un nom d'attribut d'expression pour remplacer ce nom d'attribut dans l'expression.

Noms d'attributs contenant des caractères spéciaux

Dans une expression, un point (« . ») est interprété comme un caractère de séparation dans chemin d'accès à un document. Cependant, DynamoDB vous permet également d'utiliser un caractère point et d'autres caractères spéciaux, tels qu'un trait d'union (« - ») dans le cadre d'un nom d'attribut. Cela peut être ambiguë dans certains cas. À titre d'illustration, supposons que vous souhaitiez récupérer l'attribut Safety.Warning d'un élément ProductCatalog (consultez Spécification des attributs d'élément lors de l'utilisation d'expressions).

Supposons que vous vouliez accéder à Safety.Warning avec une expression de projection.

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "Safety.Warning"

DynamoDB renvoie un résultat vide au lieu de la chaîne attendue (« Always wear a helmet »). Cela est dû au fait que DynamoDB interprète un point dans une expression comme un séparateur de chemin d'accès de document. Dans ce cas, vous devez définir un nom d'attribut d'expression (tel que #sw) en remplacement de Safety.Warning. Vous pouvez ensuite utiliser l'expression de projections suivante.

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "#sw" \ --expression-attribute-names '{"#sw":"Safety.Warning"}'

DynamoDB renvoie alors le résultat correct.

Note

Si un nom d'attribut contient un point (« . ») ou un trait d'union (« - »), vousdevez utiliser un nom d'attribut d'expression pour remplacer le nom de cet attribut dans l'expression.

Attributs imbriqués

Supposons maintenant que vous vouliez accéder à l'attribut imbriqué ProductReviews.OneStar, avec l'expression de projection suivante.

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "ProductReviews.OneStar"

Le résultat contiendrait tous les commentaires de produit à une étoile, ce qui est attendu.

Mais que faire si vous avez décidé d'utiliser un nom d'attribut d'expression à la place ? Par exemple, que se passerait-il si vous deviez définir #pr1star pour remplacer ProductReviews.OneStar ?

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "#pr1star" \ --expression-attribute-names '{"#pr1star":"ProductReviews.OneStar"}'

DynamoDB renvoie un résultat vide, au lieu du mappage attendu des évaluations une étoile. En effet, DynamoDB interprète un point dans un nom d'attribut d'expression comme un caractère dans un nom d'attribut. Quand DynamoDB évalue le nom d'attribut d'expression #pr1star, il constate que ProductReviews.OneStar fait référence à un attribut scalaire, ce qui n'est pas le résultat voulu.

La bonne approche serait de définir un nom d'attribut d'expression pour chaque élément dans le chemin d'accès au document :

  • #pr — ProductReviews

  • #1star — OneStar

Vous pouvez ensuite utiliser #pr.#1star pour l'expression de projection.

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "#pr.#1star" \ --expression-attribute-names '{"#pr":"ProductReviews", "#1star":"OneStar"}'

DynamoDB renvoie alors le résultat correct.

Répétition des noms d'attributs

Les noms d'attributs d'expression sont utiles lorsque vous devez faire référence au même nom d'attribut à plusieurs reprises. Par exemple, imaginons l'expression suivante pour récupérer certains des commentaires d'un élément ProductCatalog.

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "ProductReviews.FiveStar, ProductReviews.ThreeStar, ProductReviews.OneStar"

Pour le rendre plus concis, vous pouvez remplacer ProductReviews par un nom d'attribut d'expression tel que #pr. L'expression révisée ressemblerait maintenant à ceci.

  • #pr.FiveStar, #pr.ThreeStar, #pr.OneStar

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "#pr.FiveStar, #pr.ThreeStar, #pr.OneStar" \ --expression-attribute-names '{"#pr":"ProductReviews"}'

Si vous avez défini un nom d'attribut d'expression, vous devez l'utiliser systématiquement tout au long de l'expression entière. En outre, vous ne pouvez pas ignorer le symbole #.