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: 1 validation error detected: 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é succede

  • 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 risolverlo

  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.

Riproducilo

Un unico UpdateExpression che imposta sia una mappa sia un campo dentro quella stessa mappa:

await client.send(
  new UpdateItemCommand({
    TableName: 'orders',
    Key: {pk: {S: 'ORDER#1'}, sk: {S: 'META'}},
    UpdateExpression: 'SET #a = :v, #a.#b = :w',
    ExpressionAttributeNames: {'#a': 'addr', '#b': 'city'},
    ExpressionAttributeValues: {':v': {M: {}}, ':w': {S: 'Berlin'}}
  })
);

Output reale:

ValidationException: 1 validation error detected: Invalid UpdateExpression: Two document paths overlap with each other; must remove or rewrite one of these paths; path one: [addr], path two: [addr, city]
HTTP 400

Il messaggio stampa per intero entrambi i percorsi in conflitto, quindi ti dice esattamente quale coppia riconciliare. L'ordine sarebbe indefinito se venissero applicati entrambi, ed è per questo che DynamoDB rifiuta invece di sceglierne uno.

Errori correlati

Riferimenti

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

Riprodotto il 2026-07-26 su DynamoDB Local 2.x con AWS SDK for JavaScript v3.1095.0 — l'output qui sopra è riportato alla lettera.

Lavora con DynamoDB senza la Console

Un client desktop veloce per DynamoDB che esegue il vero SQL che DynamoDB non può — JOINs, GROUP BY, aggregazioni — con modifica visuale e un agente AI sulle tue chiavi Bedrock.

Prova gratuita di 30 giorni, senza carta di credito — poi il piano Free senza limiti di tempo.