入門閱讀時間 3 分鐘

DynamoDB 項目層級動作:GetItem、PutItem、UpdateItem、DeleteItem

DynamoDB 的 API 分成三大類:以單一項目的主鍵進行操作的項目層級動作、在單一 partition 內讀取一段範圍的 Query,以及讀取所有內容的 Scan。本指南介紹第一類 — 你最常用的四個操作:GetItemPutItemUpdateItemDeleteItem。它們是 DynamoDB 提供的最便宜、最快速的呼叫,而正確掌握它們之間的差異(尤其是 PutUpdate)能避免一整類意外資料遺失的 bug。

什麼是 DynamoDB 的項目層級操作?

DynamoDB 的項目層級操作,是以完整主鍵對單一項目進行操作的四個呼叫:GetItem 讀取項目、PutItem 建立或完全取代項目、UpdateItem 就地修改特定屬性,而 DeleteItem 移除項目。每一個都精確地處理剛好一個項目,使它們成為最快速、最便宜的呼叫 — 不像 Query 與 Scan 會讀取許多項目。

  • GetItem — 以完整主鍵讀取一個項目。
  • PutItem — 建立或完全取代一個項目。
  • UpdateItem — 建立或就地修改一個項目的特定屬性
  • DeleteItem — 以完整主鍵移除一個項目。
  • 這四者都需要完整的主鍵(partition key,若表格有 sort key 則還需 sort key) — 它們精確地定位剛好一個項目。
  • PutItem 會覆寫整個項目;UpdateItem 則是外科手術式的 — 把兩者搞混,正是屬性 默默消失的原因。

決定性特徵:一個項目、完整的鍵

每個項目層級動作都以完整主鍵鎖定單一項目。這正是它們又快又便宜的原因 — DynamoDB 對 partition key 做雜湊,直接找到該項目,完成。沒有篩選、沒有掃描。如果你不 知道完整的鍵,這些就不是對的工具;那是 Query 與 Scan 的用武 之地。

假設你以 USER#<id> 為鍵管理使用者帳戶:

PK: USER#204   email, displayName, plan, createdAt
  • USER#204 執行 GetItem → 直接取得那位使用者。
  • USER#204 執行 DeleteItem → 移除那位使用者。

兩者都需要確切的鍵。沒有鍵,就沒有項目層級動作。

PutItemUpdateItem — 會咬人的那一個

這是值得內化的差異:

  • PutItem 寫入整個項目。 如果 USER#204 已存在,而你只用 {email, displayName} 執行 PutItem,現有的 plancreatedAt 屬性就沒了 — put 會取代整個項目, 而非合併。
  • UpdateItem 只改你指名的部分。 帶有 SET email = …UpdateItem 會保留其他所有 屬性原封不動,而且若項目不存在還會建立它(一種 upsert)。
Replace whole itemChange some attributes, keep therestModify one existing item?PutItemUpdateItem

經驗法則:要更改既有項目就用 UpdateItem,而 PutItem 只在你真的是指「把這個項目 寫成完整的新狀態」時才使用。PutItemUpdateItem 都接受一個 condition expression,因此你可以讓寫入帶條件 (「只有在它尚不存在時」)。

DynoTable 中的項目層級動作

想看這些操作背後的原始 API 呼叫嗎?在 DynamoDB 表達式建構器中組裝表達式與帶類型的值映射, 並用 DynamoDB JSON 轉換器把純 JSON 項目轉換成 API 的帶類型格式。

在 DynoTable 中,同樣的工作變成了視覺化:在格線中開啟一個項目以讀取它(一次 GetItem)、 編輯屬性並提交(一次 UpdateItem)、新增或取代一列(一次 PutItem),或刪除一個—— 每次操作一個項目。

在 DynoTable 的 Quick View 中讀取單一項目,並提供 Edit Item 與 Copy as JSON 操作。
在 DynoTable 的 Quick View 中讀取單一項目,並提供 Edit Item 與 Copy as JSON 操作。

陷阱與後續步驟

  • PutItem 會取代整個項目 — 若要更改少數欄位而不遺失其餘部分,請使用 UpdateItem
  • 你必須知道完整的主鍵 — 沒有鍵就代表要用 Query/Scan,而非項目層級動作。
  • 一次要處理很多項目嗎? 別一個一個地迴圈呼叫這些 — 批次操作能把它們合併成更少的往返。
  • 需要拿回舊值/新值嗎? 設定 ReturnValues, 而非另外接一次 GetItem
  • 相關: query 與 scan 的比較涵蓋讀取多個項目的那一面。

想要不寫一行 API 程式碼就讀取、寫入並刪除項目嗎? 下載 DynoTable,直接操作你的表格。

已更新