DynamoDB 可以儲存陣列嗎?
可以。DynamoDB 使用 List(L)型別儲存陣列 — 那是一種保序的集合,可以裝混合型別,包含字串、數字、布林值、null、map 與巢狀 list。若要存放不重複值的無序集合,它也提供字串、數字與二進位 Set。只要項目維持在 400 KB 以下,就沒有元素數量的上限。
List(有序陣列)
List 會保留順序,並允許重複與混合型別。它直接對應到一個 JSON 陣列,而且可以巢狀(map 的 list、list 的 list),最深 32 層。
那個文件記載的上限把最底層的值也算進去。把一個字串包進 31 層巢狀的 L 容器寫得進去;第 32 個容器就會失敗,而同樣的界線也適用於巢狀的 M:
ValidationException: Nesting Levels have exceeded supported limits:
Attributes in the item have nested levels beyond supported limitSet(不重複的值)
- Set 有三種:String Set(SS)、Number Set(NS)與 Binary Set(BS),裝的是單一型別、不重複、無序的值。
- 一個 set 不能是空的(那會引發
ValidationException)。
當成員資格與唯一性要緊時用 Set;當順序或混合型別要緊時用 List。
Set 會重新排序並拒絕重複
把 ["zulu", "alpha", "mike"] 存成一個 String Set,讀回來會是 ["alpha", "mike", "zulu"]。Number Set 則按數值排序:["30", "4", "100"] 會回傳 ["4", "30", "100"]。同樣那些值放進 List,回來時就是你寫進去的順序。
重複的成員是硬性失敗,而不是無聲去重:
ValidationException: Input collection contains duplicates而且既然一個 set 永遠不能是空的,用 DELETE 移除它最後一個成員就會把整個屬性移掉。期待拿回一個空 set 的程式碼,得到的會是一個缺席的屬性,所以請用 attribute_exists 來測試,而不是測長度是否為零。
到底裝得下幾個元素
「沒有元素數量上限」是正確的,卻難以據以行動。可用的答案是 400 KB 除以一個元素的成本:一個 list 帶 3 位元組的額外負擔,接著是每個元素自身的大小再加 1 位元組。
對於一個單字元分割區索引鍵之下、36 字元的 UUID 字串,那個數字落在 11,070 個元素。加上第 11,071 個就會被拒絕:
ValidationException: Item size has exceeded the maximum allowed size項目大小計算機把那兩個項目算成 409,599 與 409,636 位元組,所以它畫的 409,600 位元組那條線,和引擎畫的完全一致。寫入比較大的那一個要花 400 個寫入單位。
深入了解
請見 DynamoDB 資料型別,並用 JSON 轉換器轉換巢狀結構。下載 DynoTable 就能編輯 list 與 set 屬性。
參考資料
- Supported data types and naming rules in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- Constraints in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- Quotas in Amazon DynamoDB — Amazon DynamoDB Developer Guide
最後查證於 2026-07-13,對照上方連結的官方 AWS 文件。
已於 2026-07-28 透過 @aws-sdk/client-dynamodb 3.1095.0,對照 DynamoDB Local 3.3.0 量測並重現 — 上方的元素數量、巢狀界線、set 的來回結果與錯誤字串皆為引擎輸出,不是估算。錯誤字串的措辭在線上服務上可能不同。