The document path provided in the update expression is invalid for update
In breve — Stai scrivendo su un percorso nidificato (SET parent.child = :v) ma parent non esiste sull'Item — o esiste come stringa/numero invece che come mappa o lista. DynamoDB NON crea automaticamente le mappe intermedie. Crea prima il genitore (SET #p = if_not_exists(#p, :emptyMap) in un aggiornamento precedente, o inizializza {} alla creazione dell'Item), poi imposta l'attributo nidificato.
Cosa significa
ValidationException: The document path provided in the update expression
is invalid for updateUn'espressione di aggiornamento può indirizzare percorsi profondi (stats.daily.views, items[3].qty), ma ogni passo del percorso tranne l'ultimo deve già esistere sull'Item con un tipo compatibile. Se l'Item non ha un attributo stats — o stats è una stringa — non c'è dove agganciare daily, e l'aggiornamento viene rifiutato. Lo stesso controllo viene eseguito all'interno delle transazioni, dove si manifesta come una ragione di annullamento ValidationError.
Perché accade
- La mappa genitore non esiste ancora — l'Item è stato creato senza
stats, e oraSET stats.daily = :vnon ha alcunstatsin cui scendere. - Il genitore esiste con il tipo sbagliato —
statsè una stringa o un numero, non una mappa (M), quindi non ha membri da indirizzare. - Indicizzazione in una lista mancante —
SET items[0].qty = :qquandoitemsnon è sull'Item o non è una lista. - Un segmento di percorso con refuso —
SET stat.daily = :v(manca las) scende in un attributo che non c'è. - Item diversi hanno forme diverse — l'aggiornamento funziona sugli Item che portano la mappa e fallisce su quelli che non ce l'hanno (comune nei design a tabella singola con entità miste).
Come correggerlo
Inizializza le mappe genitore quando crei l'Item — scrivi
stats: {}(unaMvuota) fin dall'inizio, e gli aggiornamenti nidificati avranno sempre dove atterrare.Oppure crea il genitore su richiesta, poi imposta il figlio — due aggiornamenti. DynamoDB non ti permette di fare entrambi in un'unica espressione (è una sovrapposizione di percorsi):
// 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'}Nota che
if_not_exists(stats.daily, :v)non aiuta qui — protegge il valore, non il genitore mancante.Sostituisci invece l'intera mappa quando ne possiedi la forma completa:
SET #s = :wholeMapfunziona sia chestatsesistesse o meno.Verifica la forma reale dell'Item — leggi l'Item e controlla che l'attributo genitore esista e sia una
M/Lprima di presumere che il percorso sia valido.
L'app desktop DynoTable mostra la reale struttura nidificata di ogni Item a colpo d'occhio — puoi vedere se stats è una mappa, una stringa o è del tutto mancante prima di scriverci.
Errori correlati
- Two document paths overlap with each other — perché "crea il genitore + imposta il figlio" non può essere un'unica espressione.
- The provided expression refers to an attribute that does not exist
- Invalid UpdateExpression: Syntax error
- Impara: Update expressions · Data types
References
- Using update expressions in DynamoDB — Amazon DynamoDB Developer Guide
- TransactWriteItems — Amazon DynamoDB API Reference
- Expression attribute names (aliases) in DynamoDB — Amazon DynamoDB Developer Guide
Ultima verifica 2026-07-13 rispetto alla documentazione ufficiale AWS collegata sopra.