Two document paths overlap with each other

TL;DR — Bir UpdateExpression her belge yoluna yalnızca bir kez dokunabilir ve hiçbir yol, aynı ifadenin de dokunduğu başka bir yolun içinde oturamaz. SET profile = :p, profile.email = :e örtüşür (profile.email, profile'ın içinde yaşar); aynı özniteliği iki kez adlandırmak da öyle. Alt öğeyi üst değere katın ya da iki güncellemeye bölün.

Ne anlama gelir

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, bir UpdateExpression'daki her eylemi öğenin öznitelik değerlerine karşı güncellemeden önce oldukları gibi değerlendirir — eylemler soldan sağa birbiri ardına uygulanmaz. İki eylem örtüşen yolları (aynı öznitelik ya da bir üst öğe ve içine yuvalanmış bir şey) hedeflerse, sonuç belirsiz olurdu: profile.email = :e, profile = :p tüm map'i değiştirmeden önce mi sonra mı çalışır? Tahmin etmek yerine DynamoDB ifadeyi doğrudan reddeder. (Aynı örtüşme kontrolü bir ProjectionExpression'daki yinelenen yollar için de geçerlidir.)

Neden olur

  • Bir üst öğeyi ve alt öğesini tek bir ifadede ayarlamakSET profile = :p, profile.email = :e. İkinci yol birincinin içindedir.
  • Aynı öznitelik iki kez görünürSET updatedAt = :a REMOVE updatedAt ya da SET tags = :t ADD tags :more.
  • Bir ODM/sarmalayıcı, sizin de ayarladığınız bir yolu sessizce ekler — klasik durum: bir kitaplık, kodunuz da item.field'ı ayarlarken bir zaman damgasını ya da tüm nesneyi (SET item = :obj) otomatik yazar (otomatik createdAt/updatedAt ile Dynamoose'da görülür).
  • Bir listeyi ve elemanlarından birini birlikte güncellemekSET mylist = :l, mylist[0] = :v.

Nasıl düzeltilir

  1. Alt öğeyi üst değere katın — map'i zaten değiştiriyorsanız, yeni e-postayı içine koyun ve ikinci eylemi bırakın:

    // instead of SET profile = :p, profile.email = :e
    UpdateExpression: 'SET #p = :p',
    ExpressionAttributeValues: {':p': {name: 'Ada', email: 'ada@example.com'}}
  2. Ya da yalnızca yaprakları güncelleyin — üst öğeyi dokunmadan tutun ve yuvalanmış alanları tek tek ayarlayın (SET #p.#n = :n, #p.#e = :e). Aynı üst öğe altındaki kardeş yollar örtüşmez; yalnızca yuvalanma örtüşür.

  3. Yineleme giderin — her özniteliğin SET/REMOVE/ADD/DELETE genelinde tam olarak bir eylemde göründüğünden emin olun.

  4. Kitaplığınızın otomatik alanlarını kontrol edin — kendi ifadeniz onları zaten yazdığı yerlerde otomatik yönetilen öznitelikleri (zaman damgaları, sürümler) güncellemelerden devre dışı bırakın ya da hariç tutun.

  5. Gerçekten "üst öğeyi değiştir, sonra alt öğeyi ince ayarla" semantiğine ihtiyacınız olduğunda iki isteğe bölün — sırayla iki UpdateItem çağrısı.

Yuvalanmış map'leri elle düzenlemek, örtüşmelerin sızdığı yerdir — DynoTable masaüstü uygulaması, bir öğenin özniteliklerini yerinde düzenler ve tam olarak değişen şey için temiz, örtüşmeyen bir güncelleme gönderir.

İlgili hatalar

References

En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.

Console olmadan DynamoDB ile çalışın

DynoTable, DynamoDB için hızlı bir masaüstü istemcisidir — tablolara göz atın, SQL tarzı sorgular çalıştırın ve item'ları yerel olarak düzenleyin.