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 updateUne 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 maintenantSET stats.daily = :vn'a pas destatsoù descendre. - Le parent existe avec le mauvais type —
statsest une chaîne ou un nombre, pas un map (M), donc il n'a aucun membre à adresser. - Indexer dans une liste manquante —
SET items[0].qty = :qquanditemsn'est pas sur l'élément ou n'est pas une liste. - Un segment de chemin mal saisi —
SET stat.daily = :v(smanquant) 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
Initialise les maps parents quand tu crées l'élément — écris
stats: {}(unMvide) d'emblée, et les mises à jour imbriquées ont toujours un endroit où atterrir.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.Remplace plutôt tout le map quand tu maîtrises sa forme complète :
SET #s = :wholeMapfonctionne questatsait existé ou non.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/Lavant 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
- Two document paths overlap with each other — pourquoi « créer le parent + définir l'enfant » ne peut pas être une seule expression.
- The provided expression refers to an attribute that does not exist
- Invalid UpdateExpression: Syntax error
- Apprends : Update expressions · Data types
Références
- Using update expressions in DynamoDB — Amazon DynamoDB Developer Guide
- TransactWriteItems — Amazon DynamoDB API Reference
- Expression attribute names (aliases) in DynamoDB — Amazon DynamoDB Developer Guide
Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.