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 update

Un'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 ora SET stats.daily = :v non ha alcun stats in cui scendere.
  • Il genitore esiste con il tipo sbagliatostats è una stringa o un numero, non una mappa (M), quindi non ha membri da indirizzare.
  • Indicizzazione in una lista mancanteSET items[0].qty = :q quando items non è sull'Item o non è una lista.
  • Un segmento di percorso con refusoSET stat.daily = :v (manca la s) 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

  1. Inizializza le mappe genitore quando crei l'Item — scrivi stats: {} (una M vuota) fin dall'inizio, e gli aggiornamenti nidificati avranno sempre dove atterrare.

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

  3. Sostituisci invece l'intera mappa quando ne possiedi la forma completa: SET #s = :wholeMap funziona sia che stats esistesse o meno.

  4. Verifica la forma reale dell'Item — leggi l'Item e controlla che l'attributo genitore esista e sia una M/L prima 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

References

Ultima verifica 2026-07-13 rispetto alla documentazione ufficiale AWS collegata sopra.

Lavora con DynamoDB senza la Console

DynoTable è un client desktop veloce per DynamoDB — sfoglia le tabelle, esegui query in stile SQL e modifica gli Item localmente.