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

TL;DR — Anda menulis ke path bersarang (SET parent.child = :v) tetapi parent tidak ada pada item — atau ada sebagai string/number alih-alih map atau list. DynamoDB TIDAK membuat map perantara secara otomatis. Buat parent terlebih dahulu (SET #p = if_not_exists(#p, :emptyMap) dalam update sebelumnya, atau inisialisasi {} saat item dibuat), lalu atur atribut bersarang.

Apa artinya

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

Sebuah update expression dapat mengalamatkan path dalam (stats.daily.views, items[3].qty), tetapi setiap langkah path kecuali yang terakhir harus sudah ada pada item dengan tipe yang kompatibel. Jika item tidak punya atribut stats — atau stats adalah string — tidak ada tempat untuk menggantungkan daily, dan update ditolak. Pemeriksaan yang sama berjalan di dalam transaksi, di mana ia muncul sebagai alasan pembatalan ValidationError.

Mengapa terjadi

  • Map parent belum ada — item dibuat tanpa stats, dan sekarang SET stats.daily = :v tidak punya stats untuk dituruni.
  • Parent ada dengan tipe salahstats adalah string atau number, bukan map (M), jadi tidak punya anggota untuk dialamatkan.
  • Mengindeks ke list yang hilangSET items[0].qty = :q ketika items tidak ada pada item atau bukan list.
  • Segmen path salah ketikSET stat.daily = :v (kehilangan s) turun ke atribut yang tidak ada.
  • Item berbeda memiliki bentuk berbeda — update berfungsi pada item yang membawa map dan gagal pada yang tidak (umum dalam single-table design dengan entitas campuran).

Cara memperbaikinya

  1. Inisialisasi map parent saat Anda membuat item — tulis stats: {} (sebuah M kosong) di awal, dan update bersarang selalu punya tempat untuk mendarat.

  2. Atau buat parent sesuai permintaan, lalu atur child — dua update. DynamoDB tidak mengizinkan Anda melakukan keduanya dalam satu expression (itu tumpang tindih path):

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

    Perhatikan if_not_exists(stats.daily, :v) tidak membantu di sini — ia menjaga nilai, bukan parent yang hilang.

  3. Ganti seluruh map sebagai gantinya ketika Anda menguasai bentuk penuhnya: SET #s = :wholeMap berfungsi baik stats ada atau tidak.

  4. Verifikasi bentuk item yang sebenarnya — baca item dan periksa atribut parent ada dan bertipe M/L sebelum mengasumsikan path valid.

Aplikasi desktop DynoTable menunjukkan struktur bersarang nyata setiap item dalam sekejap — Anda dapat melihat apakah stats adalah map, string, atau hilang sepenuhnya sebelum Anda menulis ke sana.

Kesalahan terkait

References

Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.

Bekerja dengan DynamoDB tanpa Console

DynoTable adalah klien desktop yang cepat untuk DynamoDB — jelajahi tabel, jalankan query gaya SQL, dan edit Item secara lokal.