Two document paths overlap with each other

In breve — Un UpdateExpression può toccare ogni document path solo una volta, e nessun percorso può trovarsi all'interno di un altro percorso che la stessa espressione tocca anch'essa. SET profile = :p, profile.email = :e si sovrappone (profile.email risiede dentro profile); così come nominare lo stesso attributo due volte. Incorpora il figlio nel valore del genitore, o suddividi in due aggiornamenti.

Cosa significa

ValidationException: Invalid UpdateExpression: Two document paths overlap
with each other; must remove or rewrite one of these paths;
path one: [profile], path two: [profile, email]

DynamoDB valuta ogni azione in un UpdateExpression rispetto ai valori degli attributi dell'Item come erano prima dell'aggiornamento — le azioni non vengono applicate una dopo l'altra da sinistra a destra. Se due azioni puntano a percorsi sovrapposti (lo stesso attributo, o un genitore e qualcosa nidificato al suo interno), il risultato sarebbe ambiguo: profile.email = :e viene eseguito prima o dopo che profile = :p sostituisce l'intera mappa? Invece di indovinare, DynamoDB rifiuta l'espressione senza mezzi termini. (Lo stesso controllo di sovrapposizione si applica ai percorsi duplicati in una ProjectionExpression.)

Perché accade

  • Impostare un genitore e il suo figlio in un'unica espressioneSET profile = :p, profile.email = :e. Il secondo percorso è dentro il primo.
  • Lo stesso attributo compare due volteSET updatedAt = :a REMOVE updatedAt, o SET tags = :t ADD tags :more.
  • Un ODM/wrapper aggiunge silenziosamente un percorso che imposti anche tu — il caso classico: una libreria scrive automaticamente un timestamp o l'intero oggetto (SET item = :obj) mentre il tuo codice imposta anche item.field (visto in Dynamoose con createdAt/updatedAt automatici).
  • Aggiornare una lista e uno dei suoi elementi insiemeSET mylist = :l, mylist[0] = :v.

Come correggerlo

  1. Incorpora il figlio nel valore del genitore — se stai comunque sostituendo la mappa, metti la nuova email al suo interno e rimuovi la seconda azione:

    // instead of SET profile = :p, profile.email = :e
    UpdateExpression: 'SET #p = :p',
    ExpressionAttributeValues: {':p': {name: 'Ada', email: 'ada@example.com'}}
  2. Oppure aggiorna solo le foglie — lascia intatto il genitore e imposta i campi nidificati individualmente (SET #p.#n = :n, #p.#e = :e). I percorsi fratelli sotto lo stesso genitore non si sovrappongono; solo la nidificazione lo fa.

  3. Deduplica — assicurati che ogni attributo compaia in esattamente un'azione tra SET/REMOVE/ADD/DELETE.

  4. Controlla i campi automatici della tua libreria — disabilita o escludi gli attributi auto-gestiti (timestamp, versioni) dagli aggiornamenti dove la tua espressione li scrive già.

  5. Suddividi in due richieste quando ti serve genuinamente la semantica "sostituisci il genitore, poi modifica il figlio" — due chiamate UpdateItem, in ordine.

Modificare mappe nidificate a mano è dove le sovrapposizioni si insinuano — l'app desktop DynoTable modifica gli attributi di un Item in-place ed emette un aggiornamento pulito e non sovrapposto per esattamente ciò che è cambiato.

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.