The document path provided in the update expression is invalid for update

En bref — Tu écris vers un chemin imbriqué (SET parent.child = :v) mais parent n'existe pas sur l'élément — ou existe comme chaîne/nombre au lieu d'un map ou d'une liste. DynamoDB ne crée PAS automatiquement les maps intermédiaires. Crée d'abord le parent (SET #p = if_not_exists(#p, :emptyMap) dans une mise à jour préalable, ou initialise {} à la création de l'élément), puis définis l'attribut imbriqué.

Ce que ça signifie

ValidationException: The document path provided in the update expression
is invalid for update

Une expression de mise à jour peut adresser des chemins profonds (stats.daily.views, items[3].qty), mais chaque étape du chemin sauf la dernière doit déjà exister sur l'élément avec un type compatible. Si l'élément n'a pas d'attribut stats — ou si stats est une chaîne — il n'y a nulle part où accrocher daily, et la mise à jour est rejetée. La même vérification s'exécute à l'intérieur des transactions, où elle apparaît comme une raison d'annulation ValidationError.

Pourquoi ça arrive

  • Le map parent n'existe pas encore — l'élément a été créé sans stats, et maintenant SET stats.daily = :v n'a pas de stats où descendre.
  • Le parent existe avec le mauvais typestats est une chaîne ou un nombre, pas un map (M), donc il n'a aucun membre à adresser.
  • Indexer dans une liste manquanteSET items[0].qty = :q quand items n'est pas sur l'élément ou n'est pas une liste.
  • Un segment de chemin mal saisiSET stat.daily = :v (s manquant) descend dans un attribut qui n'est pas là.
  • Des éléments différents ont des formes différentes — la mise à jour fonctionne sur les éléments qui portent le map et échoue sur ceux qui ne le portent pas (courant dans les conceptions mono-table à entités mixtes).

Comment corriger

  1. Initialise les maps parents quand tu crées l'élément — écris stats: {} (un M vide) d'emblée, et les mises à jour imbriquées ont toujours un endroit où atterrir.

  2. Ou crée le parent à la demande, puis définis l'enfant — deux mises à jour. DynamoDB ne te laissera pas faire les deux dans une seule expression (c'est un chevauchement de chemins) :

    // update 1 — create the map only if it's missing
    UpdateExpression: 'SET #s = if_not_exists(#s, :empty)',
    ExpressionAttributeNames: {'#s': 'stats'},
    ExpressionAttributeValues: {':empty': {}}
    
    // update 2 — now the nested set is safe
    UpdateExpression: 'SET #s.#d = :v',
    ExpressionAttributeNames: {'#s': 'stats', '#d': 'daily'}

    Note que if_not_exists(stats.daily, :v) n'aide pas ici — il protège la valeur, pas le parent manquant.

  3. Remplace plutôt tout le map quand tu maîtrises sa forme complète : SET #s = :wholeMap fonctionne que stats ait existé ou non.

  4. Vérifie la forme réelle de l'élément — lis l'élément et vérifie que l'attribut parent existe et est un M/L avant de supposer que le chemin est valide.

L'application de bureau DynoTable montre la vraie structure imbriquée de chaque élément d'un coup d'œil — tu peux voir si stats est un map, une chaîne, ou entièrement absent avant d'y écrire.

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.