The document path provided in the update expression is invalid for update
TL;DR — Yuvalanmış bir yola (SET parent.child = :v) yazıyorsunuz ama parent öğede yok — ya da bir map veya list yerine bir string/number olarak var. DynamoDB ara map'leri otomatik oluşturmaz. Önce üst öğeyi oluşturun (önceki bir güncellemede SET #p = if_not_exists(#p, :emptyMap) ya da öğe oluşturulurken {} başlatın), sonra yuvalanmış özniteliği ayarlayın.
Ne anlama gelir
ValidationException: The document path provided in the update expression
is invalid for updateBir güncelleme ifadesi derin yolları (stats.daily.views, items[3].qty) adresleyebilir, ancak yolun sonuncusu hariç her adımı, öğede uyumlu bir türle zaten var olmalıdır. Öğenin stats özniteliği yoksa — ya da stats bir string ise — daily'yi asacak bir yer yoktur ve güncelleme reddedilir. Aynı kontrol, bir ValidationError iptal nedeni olarak belirdiği işlemlerin içinde de çalışır.
Neden olur
- Üst map henüz yok — öğe
statsolmadan oluşturuldu ve şimdiSET stats.daily = :v'nin içine ineceği birstats'ı yok. - Üst öğe yanlış türle var —
statsbir map (M) değil, bir string veya number, dolayısıyla adreslenecek üyesi yok. - Eksik bir listeye indeksleme —
itemsöğede yokken ya da bir liste değilkenSET items[0].qty = :q. - Yazım hatalı bir yol parçası —
SET stat.daily = :v(seksik), orada olmayan bir özniteliğin içine iner. - Farklı öğelerin farklı şekilleri var — güncelleme, map'i taşıyan öğelerde çalışır ve taşımayanlarda başarısız olur (karışık varlıklı tek tablo tasarımlarında yaygın).
Nasıl düzeltilir
Öğeyi oluşturduğunuzda üst map'leri başlatın — önceden
stats: {}(boş birM) yazın ve yuvalanmış güncellemeler her zaman inecek bir yere sahip olsun.Ya da üst öğeyi talep üzerine oluşturun, sonra alt öğeyi ayarlayın — iki güncelleme. DynamoDB her ikisini de tek bir ifadede yapmanıza izin vermez (bu bir yol örtüşmesidir):
// 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'}if_not_exists(stats.daily, :v)'nin burada yardımcı olmadığını unutmayın — eksik üst öğeyi değil, değeri korur.Tüm şeklini siz sahiplendiğinizde bunun yerine tüm map'i değiştirin:
SET #s = :wholeMap,statsvar olsun ya da olmasın çalışır.Gerçek öğe şeklini doğrulayın — yolun geçerli olduğunu varsaymadan önce öğeyi okuyun ve üst özniteliğin var olduğunu ve bir
M/Lolduğunu kontrol edin.
DynoTable masaüstü uygulaması her öğenin gerçek yuvalanmış yapısını bir bakışta gösterir — ona yazmadan önce stats'ın bir map mi, bir string mi yoksa tamamen eksik mi olduğunu görebilirsiniz.
İlgili hatalar
- Two document paths overlap with each other — "üst öğeyi oluştur + alt öğeyi ayarla" neden tek bir ifade olamaz.
- The provided expression refers to an attribute that does not exist
- Invalid UpdateExpression: Syntax error
- Öğrenin: 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
En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.