DynamoDB 基于项的操作:GetItem、PutItem、UpdateItem、DeleteItem
DynamoDB 的 API 分为三大类:基于项的操作,按主键作用于单个项;Query,读取一个分区
内的一段范围;以及 Scan,读取所有内容。本指南讲第一类——你用得最多的四个操作:
GetItem、PutItem、UpdateItem、DeleteItem。它们是 DynamoDB 提供的最便宜、最快的调用,
而把它们的区分搞对(尤其是 Put 与 Update)能避免一整类意外丢数据的 bug。
什么是 DynamoDB 基于项的操作?
DynamoDB 基于项的操作,是按完整主键作用于单个项的那四个调用:GetItem 读取它,PutItem 创建或完全替换它,UpdateItem 原地修改指定属性,DeleteItem 删除它。每个操作都恰好针对一个项,因而是最快、最便宜的调用——不同于一次读取多项的 Query 和 Scan。
GetItem—— 按完整主键读取一个项。PutItem—— 创建或完全替换一个项。UpdateItem—— 创建或原地修改某个项的指定属性。DeleteItem—— 按完整主键删除一个项。- 这四个都需要完整主键(分区键,若表有排序键还需排序键)—— 它们精确定位到恰好一个项。
PutItem覆盖整个项;UpdateItem是外科手术式的 —— 把它们搞混,属性就会悄悄消失。
决定性特征:一个项,完整键
每个基于项的操作都按完整主键定位单个项。这正是它们快且便宜的原因 —— DynamoDB 对分区键 做哈希,直奔那个项,完事。没有过滤,没有扫描。如果你不知道完整键,这些就不是合适的工具;那是 Query 和 Scan 的用武之地。
假设你管理以 USER#<id> 为键的用户账户:
PK: USER#204 email, displayName, plan, createdAt- 对
USER#204执行GetItem→ 直接得到那个用户。 - 对
USER#204执行DeleteItem→ 删除那个用户。
两者都需要确切的键。没有键,就没有基于项的操作。
PutItem 与 UpdateItem —— 会咬人的那个
这个区分值得牢牢记住:
PutItem写入整个项。 如果USER#204已存在,而你用仅含{email, displayName}的PutItem,那么现有的plan和createdAt属性就没了 —— put 替换整个项,它不合并。UpdateItem只改你指定的内容。 带SET email = …的UpdateItem会保持其他所有属性 不变,并在项不存在时创建它(一次 upsert)。
经验法则:要修改一个已存在的项就用 UpdateItem,仅当你确实是指「把这个项写成全新的完整
状态」时才用 PutItem。PutItem 和 UpdateItem 都接受一个
条件表达式,让你可以让写入有条件地进行(「仅当它尚
不存在时」)。
DynoTable 中的基于项的操作
想看这些操作背后的原始 API 调用吗?在 DynamoDB 表达式构建器中组装表达式和类型化的值映射, 用 DynamoDB JSON 转换器把纯 JSON 项转换成 API 的类型化格式。
在 DynoTable 中,同样的工作变成了可视化:在网格中打开一个项来读取它(一次 GetItem),
编辑属性并提交(一次 UpdateItem),新增或替换一行(一次 PutItem),或者删除一行——
每次操作一个项。

陷阱与下一步
PutItem替换整个项 —— 要在不丢失其余属性的前提下只改几个字段,用UpdateItem。- 你必须知道完整主键 —— 没有键就意味着用 Query/Scan,而非基于项的操作。
- 一次要处理很多项? 别逐个循环调用这些操作 —— 批处理操作能把它们折叠进更少的往返。
- 需要拿回旧值/新值? 设置
ReturnValues,而不是再补一次GetItem。 - 相关: Query 与 Scan 讲了读取多项的那一面。
想读、写、删项而一行 API 代码都不写吗?下载 DynoTable,直接操作你的表。


