Two document paths overlap with each other

TL;DR — Satu UpdateExpression hanya boleh menyentuh tiap 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 tinggal di dalam profile); begitu pula menyebut atribut yang sama dua kali. Lipat anaknya ke dalam nilai induknya, atau pecah menjadi dua update.

Apa artinya

ValidationException: 1 validation error detected: 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 per satu dari kiri ke kanan. Kalau dua aksi menyasar path yang tumpang-tindih (atribut yang sama, atau sebuah induk 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-nya mentah-mentah. (Pemeriksaan tumpang-tindih yang sama berlaku untuk path duplikat di ProjectionExpression.)

Mengapa itu terjadi

  • Menyetel induk dan anaknya 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.
  • Sebuah ODM/wrapper diam-diam menambahkan path yang juga Anda setel — kasus klasik: sebuah library otomatis menulis timestamp atau seluruh objek (SET item = :obj) sementara kode Anda juga menyetel item.field (terlihat di Dynamoose dengan createdAt/updatedAt otomatis).
  • Memperbarui sebuah list dan salah satu elemennya sekaligusSET mylist = :l, mylist[0] = :v.

Bagaimana cara memperbaikinya

  1. Lipat anaknya ke dalam nilai induk — kalau toh Anda mengganti seluruh map, taruh email barunya di dalam map itu dan buang aksi keduanya:

    // instead of SET profile = :p, profile.email = :e
    UpdateExpression: 'SET #p = :p',
    ExpressionAttributeValues: {':p': {name: 'Ada', email: 'ada@example.com'}}
  2. Atau perbarui daunnya saja — biarkan induknya tak tersentuh dan setel field bersarangnya satu per satu (SET #p.#n = :n, #p.#e = :e). Path bersaudara di bawah induk yang sama tidak tumpang-tindih; hanya penyarangan yang bermasalah.

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

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

  5. Pecah menjadi dua request ketika Anda memang butuh semantik "ganti induk, lalu ubah anaknya" — dua panggilan UpdateItem, secara berurutan.

Menyunting map bersarang secara manual adalah tempat tumpang-tindih menyelinap — aplikasi desktop DynoTable menyunting atribut sebuah item di tempatnya dan mengirim update yang bersih dan tidak tumpang-tindih persis untuk apa yang berubah.

Cara mereproduksinya

Satu UpdateExpression yang menyetel sebuah map sekaligus sebuah field di dalam map yang sama:

await client.send(
  new UpdateItemCommand({
    TableName: 'orders',
    Key: {pk: {S: 'ORDER#1'}, sk: {S: 'META'}},
    UpdateExpression: 'SET #a = :v, #a.#b = :w',
    ExpressionAttributeNames: {'#a': 'addr', '#b': 'city'},
    ExpressionAttributeValues: {':v': {M: {}}, ':w': {S: 'Berlin'}}
  })
);

Keluaran sebenarnya:

ValidationException: 1 validation error detected: Invalid UpdateExpression: Two document paths overlap with each other; must remove or rewrite one of these paths; path one: [addr], path two: [addr, city]
HTTP 400

Pesannya mencetak kedua path yang berkonflik secara lengkap, jadi ia memberi tahu persis pasangan mana yang harus didamaikan. Urutannya tidak terdefinisi kalau keduanya diterapkan, dan itulah alasan DynamoDB menolak ketimbang memilih salah satu.

Kesalahan terkait

Referensi

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

Direproduksi 2026-07-26 terhadap DynamoDB Local 2.x dengan AWS SDK for JavaScript v3.1095.0 — keluaran di atas dikutip apa adanya.

Bekerja dengan DynamoDB tanpa Console

Klien desktop DynamoDB yang cepat dan menjalankan SQL sungguhan yang tidak bisa dijalankan DynamoDB — JOINs, GROUP BY, agregasi — dengan editing visual dan agen AI pada kunci Bedrock milik Anda sendiri.

Uji coba gratis 30 hari, tanpa kartu kredit — lalu paket Free tanpa batas waktu.