The document path provided in the update expression is invalid for update

TL;DR — Du schreibst auf einen verschachtelten Pfad (SET parent.child = :v), aber parent existiert nicht auf dem Item — oder existiert als String/Zahl statt als Map oder Liste. DynamoDB erstellt Zwischen-Maps NICHT automatisch. Erstelle zuerst den Parent (SET #p = if_not_exists(#p, :emptyMap) in einem vorherigen Update, oder initialisiere {} bei der Item-Erstellung) und setze dann das verschachtelte Attribut.

Was es bedeutet

ValidationException: The document path provided in the update expression
is invalid for update

Ein Update-Ausdruck kann tiefe Pfade adressieren (stats.daily.views, items[3].qty), aber jeder Schritt des Pfades außer dem letzten muss bereits auf dem Item mit einem kompatiblen Typ existieren. Wenn das Item kein stats-Attribut hat — oder stats ein String ist — gibt es nirgends, wo daily hingehängt werden könnte, und das Update wird abgewiesen. Derselbe Check läuft innerhalb von Transaktionen, wo er als ValidationError-Abbruchgrund erscheint.

Warum es passiert

  • Die Parent-Map existiert noch nicht — das Item wurde ohne stats erstellt, und jetzt hat SET stats.daily = :v kein stats, in das es hinabsteigen könnte.
  • Der Parent existiert mit dem falschen Typstats ist ein String oder eine Zahl, keine Map (M), hat also keine Member zum Adressieren.
  • Indizieren in eine fehlende ListeSET items[0].qty = :q, wenn items nicht auf dem Item ist oder keine Liste ist.
  • Ein vertipptes PfadsegmentSET stat.daily = :v (fehlendes s) steigt in ein Attribut hinab, das nicht da ist.
  • Verschiedene Items haben verschiedene Formen — das Update funktioniert auf Items, die die Map tragen, und schlägt bei denen fehl, die es nicht tun (häufig in Single-Table-Designs mit gemischten Entities).

So behebst du es

  1. Initialisiere Parent-Maps, wenn du das Item erstellst — schreibe stats: {} (eine leere M) von vornherein, und verschachtelte Updates haben immer einen Landeplatz.

  2. Oder erstelle den Parent bei Bedarf und setze dann das Child — zwei Updates. DynamoDB lässt dich beides nicht in einem Ausdruck tun (das ist eine Pfadüberlappung):

    // 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'}

    Beachte, dass if_not_exists(stats.daily, :v) hier nicht hilft — es schützt den Wert, nicht den fehlenden Parent.

  3. Ersetze stattdessen die ganze Map, wenn du ihre volle Form besitzt: SET #s = :wholeMap funktioniert, egal ob stats existierte oder nicht.

  4. Verifiziere die reale Item-Form — lies das Item und prüfe, dass das Parent-Attribut existiert und eine M/L ist, bevor du annimmst, dass der Pfad gültig ist.

Die DynoTable-Desktop-App zeigt die reale verschachtelte Struktur jedes Items auf einen Blick — du kannst sehen, ob stats eine Map, ein String oder ganz fehlend ist, bevor du darauf schreibst.

Verwandte Fehler

References

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.