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 updateSebuah 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 sekarangSET stats.daily = :vtidak punyastatsuntuk dituruni. - Parent ada dengan tipe salah —
statsadalah string atau number, bukan map (M), jadi tidak punya anggota untuk dialamatkan. - Mengindeks ke list yang hilang —
SET items[0].qty = :qketikaitemstidak ada pada item atau bukan list. - Segmen path salah ketik —
SET stat.daily = :v(kehilangans) 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
Inisialisasi map parent saat Anda membuat item — tulis
stats: {}(sebuahMkosong) di awal, dan update bersarang selalu punya tempat untuk mendarat.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.Ganti seluruh map sebagai gantinya ketika Anda menguasai bentuk penuhnya:
SET #s = :wholeMapberfungsi baikstatsada atau tidak.Verifikasi bentuk item yang sebenarnya — baca item dan periksa atribut parent ada dan bertipe
M/Lsebelum 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
- Two document paths overlap with each other — mengapa "buat parent + atur child" tidak bisa satu expression.
- The provided expression refers to an attribute that does not exist
- Invalid UpdateExpression: Syntax error
- Pelajari: 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
Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.