大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
CRUD 与条件写
DynamoDB 的增删改查通过 Item 级 API 完成:PutItem、GetItem、UpdateItem、DeleteItem。语义与 MongoDB CRUD、MySQL DML 一致,但 必须提供完整主键。
学习目标
- 掌握四类基本 Item 操作
- 理解
UpdateItem表达式与ConditionExpression - 对比 MySQL DML 与 MongoDB 更新运算符
核心内容
Create / Replace(PutItem)
aws dynamodb put-item \
--table-name UserProgress \
--item '{
"PK": {"S": "USER#u_1001"},
"SK": {"S": "LESSON#ddb-crud"},
"action": {"S": "view"},
"updatedAt": {"S": "2026-03-01T10:00:00Z"}
}'
PutItem 整项覆盖(同主键存在则替换)。MySQL 等价见 sql-essentials INSERT ... ON DUPLICATE KEY UPDATE。
Read(GetItem)
aws dynamodb get-item \
--table-name UserProgress \
--key '{"PK":{"S":"USER#u_1001"},"SK":{"S":"LESSON#ddb-crud"}}'
仅主键精确查找;条件过滤走 Query/Scan(ddb-query)。
Update 与条件写
client.updateItem(UpdateItemRequest.builder()
.tableName("UserProgress")
.key(Map.of(
"PK", AttributeValue.builder().s("USER#u_1001").build(),
"SK", AttributeValue.builder().s("LESSON#ddb-crud").build()))
.updateExpression("SET #a = :action, viewCount = if_not_exists(viewCount, :zero) + :inc")
.expressionAttributeNames(Map.of("#a", "action"))
.expressionAttributeValues(Map.of(
":action", AttributeValue.builder().s("complete").build(),
":inc", AttributeValue.builder().n("1").build(),
":zero", AttributeValue.builder().n("0").build()))
.conditionExpression("attribute_exists(PK)") // 仅更新已存在项
.build());
ConditionExpression 实现 乐观锁(如 version = :expected)。MongoDB 对照 mongo-crud 的 $inc / $set。
Delete(DeleteItem)
aws dynamodb delete-item \
--table-name UserProgress \
--key '{"PK":{"S":"USER#u_1001"},"SK":{"S":"LESSON#ddb-crud"}}'
批量删除无 SQL 式 DELETE WHERE;需 Query 后逐条 Delete 或 Streams + Lambda。
练习
- PutItem 写入 3 条不同 SK 的进度,GetItem 验证
- UpdateItem 用条件
viewCount < :max限制更新 - 写 MySQL
UPDATE完成与上方 viewCount 自增等价的语句
小结
Put/Get/Update/Delete 四 API + ConditionExpression = 安全 CRUD;无 ad-hoc UPDATE WHERE。 下一课 GSI 与 LSI。