Two document paths overlap with each other

TL;DR — Eine UpdateExpression darf jeden Dokumentpfad nur einmal berühren, und kein Pfad darf innerhalb eines anderen Pfades liegen, den dieselbe Expression ebenfalls berührt. SET profile = :p, profile.email = :e überlappt (profile.email liegt in profile); ebenso das zweimalige Benennen desselben Attributs. Falte das Kind in den Elternwert oder teile in zwei Updates.

Was es bedeutet

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 wertet jede Aktion in einer UpdateExpression gegen die Attributwerte des Items aus, wie sie vor dem Update waren — Aktionen werden nicht nacheinander von links nach rechts angewendet. Wenn zwei Aktionen überlappende Pfade adressieren (dasselbe Attribut oder ein Elternteil und etwas darin Verschachteltes), wäre das Ergebnis mehrdeutig: Läuft profile.email = :e vor oder nach profile = :p, das die ganze Map ersetzt? Statt zu raten, weist DynamoDB die Expression rundheraus zurück. (Dieselbe Overlap-Prüfung gilt für doppelte Pfade in einer ProjectionExpression.)

Warum es passiert

  • Einen Elternteil und sein Kind in einer Expression setzenSET profile = :p, profile.email = :e. Der zweite Pfad liegt im ersten.
  • Dasselbe Attribut erscheint zweimalSET updatedAt = :a REMOVE updatedAt oder SET tags = :t ADD tags :more.
  • Ein ODM/Wrapper fügt stillschweigend einen Pfad hinzu, den du ebenfalls setzt — der klassische Fall: eine Bibliothek schreibt automatisch einen Zeitstempel oder das ganze Objekt (SET item = :obj), während dein Code auch item.field setzt (gesehen in Dynamoose mit automatischem createdAt/updatedAt).
  • Eine Liste und eines ihrer Elemente zusammen aktualisierenSET mylist = :l, mylist[0] = :v.

So behebst du es

  1. Falte das Kind in den Elternwert — wenn du die Map ohnehin ersetzt, setze die neue E-Mail hinein und lass die zweite Aktion weg:

    // instead of SET profile = :p, profile.email = :e
    UpdateExpression: 'SET #p = :p',
    ExpressionAttributeValues: {':p': {name: 'Ada', email: 'ada@example.com'}}
  2. Oder aktualisiere nur die Blätter — lass den Elternteil unberührt und setze die verschachtelten Felder einzeln (SET #p.#n = :n, #p.#e = :e). Geschwisterpfade unter demselben Elternteil überlappen nicht; nur Verschachtelung tut das.

  3. Dedupliziere — stelle sicher, dass jedes Attribut in genau einer Aktion über SET/REMOVE/ADD/DELETE erscheint.

  4. Prüfe die Auto-Felder deiner Bibliothek — deaktiviere oder schließe automatisch verwaltete Attribute (Zeitstempel, Versionen) aus Updates aus, in denen deine eigene Expression sie bereits schreibt.

  5. Teile in zwei Requests, wenn du wirklich die Semantik "Elternteil ersetzen, dann Kind anpassen" brauchst — zwei UpdateItem-Aufrufe, in Reihenfolge.

Verschachtelte Maps von Hand zu bearbeiten ist der Ort, an dem sich Overlaps einschleichen — die DynoTable-Desktop-App bearbeitet die Attribute eines Items an Ort und Stelle und stellt ein sauberes, nicht überlappendes Update für genau das aus, was sich geändert hat.

Verwandte Fehler

Referenzen

Zuletzt verifiziert am 2026-07-13 gegen die oben verlinkte offizielle AWS-Dokumentation.

Mit DynamoDB ohne die Console arbeiten

DynoTable ist ein schneller Desktop-Client für DynamoDB — durchsuche Tabellen, führe SQL-artige Queries aus und bearbeite Items lokal.