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 ayarlamak —
SET profile = :p, profile.email = :e. İkinci yol birincinin içindedir. - Aynı öznitelik iki kez görünür —
SET updatedAt = :a REMOVE updatedAtya daSET 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 (otomatikcreatedAt/updatedAtile Dynamoose'da görülür). - Bir listeyi ve elemanlarından birini birlikte güncellemek —
SET mylist = :l, mylist[0] = :v.
Nasıl düzeltilir
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'}}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.Yineleme giderin — her özniteliğin
SET/REMOVE/ADD/DELETEgenelinde tam olarak bir eylemde göründüğünden emin olun.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.
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
- The document path provided is invalid for update — diğer yuvalanmış yol güncelleme hatası (iki kez yazılmış yerine üst öğe eksik).
- Invalid UpdateExpression: Syntax error
- Öğrenin: Update expressions
References
- Using update expressions in DynamoDB — Amazon DynamoDB Developer Guide
- Referring to item attributes when using expressions in DynamoDB — Amazon DynamoDB Developer Guide
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.