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 update

Bir 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 stats olmadan oluşturuldu ve şimdi SET stats.daily = :v'nin içine ineceği bir stats'ı yok.
  • Üst öğe yanlış türle varstats bir map (M) değil, bir string veya number, dolayısıyla adreslenecek üyesi yok.
  • Eksik bir listeye indekslemeitems öğede yokken ya da bir liste değilken SET items[0].qty = :q.
  • Yazım hatalı bir yol parçasıSET stat.daily = :v (s eksik), 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

  1. Öğeyi oluşturduğunuzda üst map'leri başlatın — önceden stats: {} (boş bir M) yazın ve yuvalanmış güncellemeler her zaman inecek bir yere sahip olsun.

  2. 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.

  3. Tüm şeklini siz sahiplendiğinizde bunun yerine tüm map'i değiştirin: SET #s = :wholeMap, stats var olsun ya da olmasın çalışır.

  4. 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/L olduğ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

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.