An operand in the update expression has an incorrect data type
TL;DR — L'action de l'update est vérifiée par rapport à ce qui est réellement stocké (et par rapport à la valeur que tu as envoyée), et l'un des deux ne convient pas : ADD contre un attribut qui n'est ni un nombre ni un set, list_append contre quelque chose qui n'est pas une liste, ou un opérande de set dont le type d'élément ne correspond pas au set stocké. Fais correspondre l'opérande au type stocké — ou corrige l'élément dont le type a dérivé.
Ce que ça signifie
ValidationException: An operand in the update expression has an incorrect data typeLes actions d'update ont des règles de type strictes : ADD ne fonctionne que sur les nombres et les sets (SS/NS/BS), DELETE uniquement sur les sets, et list_append prend deux listes. DynamoDB évalue l'expression par rapport aux types d'attributs actuels de l'élément au moment de l'écriture — donc la même requête peut réussir sur un élément et échouer sur un autre dont l'attribut contient un type différent. Un cousin proche est rejeté plus tôt, au moment de l'analyse de l'expression, quand le type de la valeur envoyée ne peut jamais convenir à l'opérateur :
ValidationException: Invalid UpdateExpression: Incorrect operand type for
operator or function; operator: ADD, operand type: LISTPourquoi ça arrive
ADD counter :onemaiscounterest stocké comme une chaîne — par exemple l'élément a été importé avec"5"(typeS) au lieu de5(typeN).ADD tags :tavec un opérande liste (L) —ADDregroupe dans des sets, pas des listes. Les listes s'ajoutent avecSET+list_append.list_append(mylist, :v)oùmylistest une map, un set ou un scalaire — les deux arguments doivent être des listes (enveloppe un élément unique dans une liste à un seul élément).- Incompatibilité de type d'élément de set —
ADD/DELETEavec un opérande string set (SS) contre un number set (NS) stocké, ou vice versa. - Dérive de type entre éléments — des writers mélangés (un ancien import, un autre service) ont laissé le même attribut en
Nsur certains éléments et enSsur d'autres, donc l'update n'échoue que parfois.
Comment le corriger
Compteurs : stocke la valeur comme un nombre et envoie un opérande nombre :
UpdateExpression: 'ADD #c :one', ExpressionAttributeValues: {':one': 1} // {N: "1"} — not a stringListes : utilise
SETaveclist_append, et enveloppe le nouvel élément dans une liste :UpdateExpression: 'SET #l = list_append(if_not_exists(#l, :empty), :new)', ExpressionAttributeValues: {':new': ['item'], ':empty': []}Sets : garde les opérandes
ADD/DELETEdu même type de set que l'attribut stocké (SSavecSS,NSavecNS).Corrige les éléments qui ont dérivé — trouve les éléments dont l'attribut porte le mauvais type et réécris-les une fois ; le symptôme « le même update échoue sur certains éléments » est toujours une question de données, pas de code.
La dérive de type est invisible dans la plupart des consoles — l'application de bureau DynoTable affiche le type réellement stocké de chaque attribut à côté de sa valeur, donc un compteur "5"-en-chaîne ressort immédiatement.
Erreurs liées
- Float types are not supported — friction de type nombre côté SDK.
- Number overflow
- Type mismatch: key element does not match schema
- En savoir plus : Update expressions · Atomic counters · Data types
Références
- Using update expressions in DynamoDB — Amazon DynamoDB Developer Guide
- TransactWriteItems — Amazon DynamoDB API Reference
- Supported data types and naming rules in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.