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 updateEin 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
statserstellt, und jetzt hatSET stats.daily = :vkeinstats, in das es hinabsteigen könnte. - Der Parent existiert mit dem falschen Typ —
statsist ein String oder eine Zahl, keine Map (M), hat also keine Member zum Adressieren. - Indizieren in eine fehlende Liste —
SET items[0].qty = :q, wennitemsnicht auf dem Item ist oder keine Liste ist. - Ein vertipptes Pfadsegment —
SET stat.daily = :v(fehlendess) 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
Initialisiere Parent-Maps, wenn du das Item erstellst — schreibe
stats: {}(eine leereM) von vornherein, und verschachtelte Updates haben immer einen Landeplatz.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.Ersetze stattdessen die ganze Map, wenn du ihre volle Form besitzt:
SET #s = :wholeMapfunktioniert, egal obstatsexistierte oder nicht.Verifiziere die reale Item-Form — lies das Item und prüfe, dass das Parent-Attribut existiert und eine
M/List, 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
- Two document paths overlap with each other — warum „Parent erstellen + Child setzen" kein einzelner Ausdruck sein kann.
- The provided expression refers to an attribute that does not exist
- Invalid UpdateExpression: Syntax error
- Learn: Update expressions · Data types
References
- Using update expressions in DynamoDB — Amazon DynamoDB Developer Guide
- TransactWriteItems — Amazon DynamoDB API Reference
- Expression attribute names (aliases) in DynamoDB — Amazon DynamoDB Developer Guide
Zuletzt verifiziert am 2026-07-13 gegen die oben verlinkte offizielle AWS-Dokumentation.