An operand in the update expression has an incorrect data type

TL;DR — 更新的動作會對照實際儲存的內容(以及你送出的值)做型別檢查,而其中一個不符:對非數字或集合的屬性做 ADD、對非 list 的東西做 list_append,或元素型別與已儲存集合不符的集合運算元。讓運算元符合已儲存的型別 — 或修正型別偏移的項目。

這是什麼意思

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

更新動作有嚴格的型別規則:ADD 只對數字集合SS/NS/BS)運作,DELETE 只對集合,而 list_append 接受兩個list。DynamoDB 在寫入時對照項目當前的屬性型別求值 expression — 因此相同的請求可能在一個項目上成功,在另一個屬性持有不同型別的項目上失敗。一個相近的表親會更早被拒絕,在 expression 解析時,當_送出值的_型別永遠無法符合運算子時:

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

為什麼會發生

  • ADD counter :onecounter 儲存為字串 — 例如項目以 "5"(型別 S)而非 5(型別 N)匯入。
  • ADD tags :t 帶 list(L)運算元ADD 收集到_集合_中,而非 list。list 以 SET + list_append 附加。
  • list_append(mylist, :v) 其中 mylist 是 map、集合或純量 — 兩個引數都必須是 list(將單一元素包成單項 list)。
  • 集合元素型別不符 — 對已儲存的數字集合(NS)用字串集合(SS)運算元做 ADD/DELETE,或反之。
  • 跨項目的型別偏移 — 混合寫入者(舊的匯入、另一個服務)在某些項目上將同一屬性留為 N、在其他項目上留為 S,因此更新只偶爾失敗。

如何修正

  1. 計數器: 將值儲存為數字並送出數字運算元:

    UpdateExpression: 'ADD #c :one',
    ExpressionAttributeValues: {':one': 1}   // {N: "1"} — not a string
  2. list: 使用 SET 搭配 list_append,並將新元素包在 list 中:

    UpdateExpression: 'SET #l = list_append(if_not_exists(#l, :empty), :new)',
    ExpressionAttributeValues: {':new': ['item'], ':empty': []}
  3. 集合:ADD/DELETE 運算元與已儲存屬性保持相同的集合型別(SSSSNSNS)。

  4. 修正偏移的項目 — 找出屬性攜帶錯誤型別的項目並一次重寫它們;「相同更新在某些項目上失敗」的症狀總是資料問題,而非程式碼。

型別偏移在大多數主控台中不可見 — DynoTable 桌面應用程式在每個屬性值旁顯示其實際儲存的型別,因此存為字串的 "5" 計數器立即凸顯。

相關錯誤

References

最後驗證於 2026-07-13,對照上方連結的 AWS 官方文件。

不必透過主控台就能操作 DynamoDB

DynoTable 是一款快速的 DynamoDB 桌面用戶端 — 瀏覽表格、執行 SQL 風格的查詢,並在本機編輯項目。