An operand in the update expression has an incorrect data type

TL;DR — Güncellemenin eylemi, gerçekte saklanana (ve gönderdiğiniz değere) karşı tür kontrol edilir ve biri uymuyor: sayı ya da küme olmayan bir özniteliğe karşı ADD, liste olmayan bir şeye karşı list_append ya da öğe türü saklanan kümeyle eşleşmeyen bir küme işleneni. İşleneni saklanan türle eşleştirin — ya da türü kaymış öğeyi düzeltin.

Ne anlama gelir

ValidationException: An operand in the update expression has an incorrect data type

Güncelleme eylemlerinin katı tür kuralları vardır: ADD yalnızca sayılarda ve kümelerde (SS/NS/BS) çalışır, DELETE yalnızca kümelerde ve list_append iki liste alır. DynamoDB, ifadeyi yazma sırasında öğenin mevcut öznitelik türlerine karşı değerlendirir — dolayısıyla aynı istek bir öğede başarılı olabilir ve özniteliği farklı bir tür tutan başka bir öğede başarısız olabilir. Yakın bir kuzeni daha erken, ifade ayrıştırma zamanında, gönderilen değerin türü operatöre asla uyamayacağında reddedilir:

ValidationException: Invalid UpdateExpression: Incorrect operand type for
operator or function; operator: ADD, operand type: LIST

Neden olur

  • ADD counter :one ama counter string olarak saklanmış — örneğin öğe 5 (tür N) yerine "5" (tür S) ile içe aktarıldı.
  • Bir liste (L) işleneniyle ADD tags :tADD, listelere değil, kümelere toplar. Listeler SET + list_append ile eklenir.
  • mylist'in bir map, küme ya da skaler olduğu list_append(mylist, :v) — her iki argüman da liste olmalıdır (tek bir elemanı tek öğelik bir liste olarak sarın).
  • Küme öğe türü uyuşmazlığı — saklanan bir sayı kümesine (NS) karşı bir string kümesi (SS) işleneniyle ADD/DELETE ya da tersi.
  • Öğeler genelinde tür kayması — karışık yazıcılar (eski bir içe aktarma, başka bir hizmet) aynı özniteliği bazı öğelerde N, başkalarında S olarak bıraktı, dolayısıyla güncelleme yalnızca bazen başarısız olur.

Nasıl düzeltilir

  1. Sayaçlar: değeri bir sayı olarak saklayın ve bir sayı işleneni gönderin:

    UpdateExpression: 'ADD #c :one',
    ExpressionAttributeValues: {':one': 1}   // {N: "1"} — not a string
  2. Listeler: list_append ile SET kullanın ve yeni elemanı bir listeye sarın:

    UpdateExpression: 'SET #l = list_append(if_not_exists(#l, :empty), :new)',
    ExpressionAttributeValues: {':new': ['item'], ':empty': []}
  3. Kümeler: ADD/DELETE işlenenlerini saklanan öznitelikle aynı küme türünde tutun (SS ile SS, NS ile NS).

  4. Kaymış öğeleri düzeltin — özniteliği yanlış türü taşıyan öğeleri bulun ve onları bir kez yeniden yazın; "aynı güncelleme bazı öğelerde başarısız oluyor" belirtisi her zaman koddan değil, veridendir.

Tür kayması çoğu konsolda görünmezdir — DynoTable masaüstü uygulaması, her özniteliğin gerçek saklanan türünü değerinin yanında görüntüler, böylece "5"-string-olarak bir sayaç hemen öne çıkar.

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