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 type

Les 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: LIST

Pourquoi ça arrive

  • ADD counter :one mais counter est stocké comme une chaîne — par exemple l'élément a été importé avec "5" (type S) au lieu de 5 (type N).
  • ADD tags :t avec un opérande liste (L)ADD regroupe dans des sets, pas des listes. Les listes s'ajoutent avec SET + list_append.
  • list_append(mylist, :v)mylist est 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 setADD/DELETE avec 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 N sur certains éléments et en S sur d'autres, donc l'update n'échoue que parfois.

Comment le corriger

  1. Compteurs : stocke la valeur comme un nombre et envoie un opérande nombre :

    UpdateExpression: 'ADD #c :one',
    ExpressionAttributeValues: {':one': 1}   // {N: "1"} — not a string
  2. Listes : utilise SET avec list_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': []}
  3. Sets : garde les opérandes ADD/DELETE du même type de set que l'attribut stocké (SS avec SS, NS avec NS).

  4. 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

Références

Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.

Travaille avec DynamoDB sans la Console

DynoTable est un client de bureau rapide pour DynamoDB — parcours les tables, exécute des requêtes de style SQL et édite les items en local.