Two document paths overlap with each other

TL;DR — Satu UpdateExpression hanya boleh menyentuh setiap document path sekali, dan tidak ada path yang boleh berada di dalam path lain yang juga disentuh expression yang sama. SET profile = :p, profile.email = :e tumpang tindih (profile.email hidup di dalam profile); begitu juga menamai atribut yang sama dua kali. Lipat child ke nilai parent, atau pisahkan menjadi dua update.

Apa artinya

ValidationException: Invalid UpdateExpression: Two document paths overlap
with each other; must remove or rewrite one of these paths;
path one: [profile], path two: [profile, email]

DynamoDB mengevaluasi setiap aksi dalam UpdateExpression terhadap nilai atribut item sebagaimana adanya sebelum update — aksi tidak diterapkan satu demi satu dari kiri ke kanan. Jika dua aksi menargetkan path yang tumpang tindih (atribut yang sama, atau parent dan sesuatu yang bersarang di dalamnya), hasilnya akan ambigu: apakah profile.email = :e berjalan sebelum atau sesudah profile = :p mengganti seluruh map? Alih-alih menebak, DynamoDB menolak expression langsung. (Pemeriksaan tumpang tindih yang sama berlaku untuk path duplikat dalam ProjectionExpression.)

Mengapa terjadi

  • Mengatur parent dan child-nya dalam satu expressionSET profile = :p, profile.email = :e. Path kedua ada di dalam yang pertama.
  • Atribut yang sama muncul dua kaliSET updatedAt = :a REMOVE updatedAt, atau SET tags = :t ADD tags :more.
  • ODM/pembungkus diam-diam menambahkan path yang juga Anda atur — kasus klasik: library otomatis menulis timestamp atau seluruh objek (SET item = :obj) sementara kode Anda juga mengatur item.field (terlihat di Dynamoose dengan createdAt/updatedAt otomatis).
  • Memperbarui list dan salah satu elemennya bersamaSET mylist = :l, mylist[0] = :v.

Cara memperbaikinya

  1. Lipat child ke nilai parent — jika Anda mengganti map bagaimanapun, letakkan email baru di dalamnya dan hapus aksi kedua:

    // instead of SET profile = :p, profile.email = :e
    UpdateExpression: 'SET #p = :p',
    ExpressionAttributeValues: {':p': {name: 'Ada', email: 'ada@example.com'}}
  2. Atau perbarui hanya daun — jaga parent tak tersentuh dan atur field bersarang secara individual (SET #p.#n = :n, #p.#e = :e). Path saudara di bawah parent yang sama tidak tumpang tindih; hanya penyarangan yang tumpang tindih.

  3. Deduplikasi — pastikan setiap atribut muncul dalam tepat satu aksi lintas SET/REMOVE/ADD/DELETE.

  4. Periksa auto-field library Anda — nonaktifkan atau kecualikan atribut yang dikelola otomatis (timestamp, versi) dari update di mana expression Anda sendiri sudah menulisnya.

  5. Pisahkan menjadi dua permintaan ketika Anda benar-benar butuh semantik "ganti parent, lalu ubah child" — dua panggilan UpdateItem, berurutan.

Mengedit map bersarang secara manual adalah tempat tumpang tindih menyelinap — aplikasi desktop DynoTable mengedit atribut item di tempat dan mengeluarkan update yang bersih dan tidak tumpang tindih untuk persis apa yang berubah.

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.