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

TL;DR — ネストされたパス(SET parent.child = :v)に書き込もうとしていますが、parent がアイテムに存在しない、あるいはマップやリストではなく文字列/数値として存在しています。DynamoDB は中間のマップを自動作成しません。まず親を作成し(先行する更新で SET #p = if_not_exists(#p, :emptyMap)、またはアイテム作成時に {} を初期化)、それからネスト属性を設定してください。

意味

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

更新式は深いパス(stats.daily.viewsitems[3].qty)を指定できますが、パスの最後 以外 のすべてのステップは、互換性のある型ですでにアイテムに存在している必要があります。アイテムに stats 属性がない、あるいは stats が文字列である場合、daily をぶら下げる場所がなく、更新は拒否されます。同じチェックはトランザクション内でも実行され、そこでは ValidationError のキャンセル理由として現れます。

発生する理由

  • 親のマップがまだ存在しない — アイテムが stats なしで作成され、今 SET stats.daily = :v に降りていく stats がない。
  • 親が誤った型で存在するstats がマップ(M)ではなく文字列や数値であるため、指定するメンバーがない。
  • 存在しないリストへのインデックス指定items がアイテムにない、またはリストでないのに SET items[0].qty = :q
  • パスセグメントのタイプミスSET stat.daily = :vs が抜けている)が、存在しない属性に降りていく。
  • アイテムごとに形状が異なる — マップを持つアイテムでは更新が動作し、持たないアイテムでは失敗する(混在エンティティのシングルテーブル設計でよくある)。

修正方法

  1. アイテム作成時に親のマップを初期化します — 前もって stats: {}(空の M)を書けば、ネストされた更新は常に着地する場所を持ちます。

  2. または必要に応じて親を作成し、それから子を設定します — 2つの更新。 DynamoDB は1つの式で両方を行わせません(それは パスの重複 です):

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

    if_not_exists(stats.daily, :v) はここでは 役に立たない ことに注意してください。それは欠落した親ではなく をガードします。

  3. マップ全体を置き換えます — その完全な形状を自分で持っている場合: SET #s = :wholeMapstats が存在したかどうかに関わらず動作します。

  4. 実際のアイテムの形状を検証します — アイテムを読み取り、パスが有効だと仮定する前に、親属性が存在して M/L であることを確認します。

DynoTable デスクトップアプリ は各アイテムの実際のネスト構造を一目で表示します。書き込む前に、stats がマップなのか、文字列なのか、まったく欠落しているのかを見ることができます。

関連するエラー

References

最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。

Console なしで DynamoDB を扱う

DynoTable は DynamoDB 向けの高速なデスクトップクライアントです — テーブルを閲覧し、SQL スタイルのクエリを実行し、アイテムをローカルで編集できます。