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 espressione —
SET profile = :p, profile.email = :e. Il secondo percorso è dentro il primo. - Lo stesso attributo compare due volte —
SET updatedAt = :a REMOVE updatedAt, oSET 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 ancheitem.field(visto in Dynamoose concreatedAt/updatedAtautomatici). - Aggiornare una lista e uno dei suoi elementi insieme —
SET mylist = :l, mylist[0] = :v.
Come correggerlo
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'}}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.Deduplica — assicurati che ogni attributo compaia in esattamente un'azione tra
SET/REMOVE/ADD/DELETE.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à.
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
- The document path provided is invalid for update — l'altro fallimento di aggiornamento su percorso nidificato (genitore mancante invece di scritto due volte).
- Invalid UpdateExpression: Syntax error
- Impara: Update expressions
References
- Using update expressions in DynamoDB — Amazon DynamoDB Developer Guide
- Referring to item attributes when using expressions in DynamoDB — Amazon DynamoDB Developer Guide
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
Ultima verifica 2026-07-13 rispetto alla documentazione ufficiale AWS collegata sopra.