CRUD 操作
insertOne/find/updateOne/deleteOne。
CRUD 操作
这一课你将能做到
- 在 mongosh 中完成
insertOne/insertMany/find/updateOne/deleteOne全套操作,并说出与 SQL DML 的对应关系 - 正确使用
$set、$inc、$unset、$push、$currentDate更新文档,解释「为什么不能像改 JS 对象一样直接替换字段」 - 用
upsert实现「不存在则插入」的幂等写入,并说清误用deleteMany的风险
为什么要学
所有业务最终都落在增删改查。MongoDB 的方法名很直观,但有一个新手必翻车的点:更新必须用更新运算符——直接传一个普通文档当更新参数,语义会变成「整篇替换」而不是「改某个字段」。
本课的例子全程围绕本站场景:做题日志 lesson_logs(谁在什么时候看了哪节课)。对齐官方 CRUD 文档;更复杂的过滤与投影留给下一课。
人话:insert 放进去,find 找出来,update 用运算符改字段,delete 删掉——语义与 SQL 同源,写法不同。
先建立图像
SQL MongoDB(集合 lesson_logs)
INSERT INTO … ↔ insertOne / insertMany
SELECT … FROM … ↔ find / findOne
UPDATE … SET … ↔ updateOne / updateMany + $set 等运算符
DELETE FROM … ↔ deleteOne / deleteMany
更新调用的三段结构,先在脑子里固化:
collection.updateOne(
{ 条件 }, // 第 1 段:filter,像 WHERE
{ $set: { … } }, // 第 2 段:update,必须是更新运算符
{ upsert: true } // 第 3 段:options,可选
)
跟着做
步骤 1:准备集合并插入
use coderoadmap_lab
// 清空练习数据(仅限实验库!)
db.lesson_logs.deleteMany({})
// 单条插入
db.lesson_logs.insertOne({
lessonSlug: "mongo-crud",
userId: "u_1001",
action: "view",
viewCount: 0,
at: new Date()
})
// 批量插入(ordered: false 时某条失败不影响后续)
db.lesson_logs.insertMany([
{ lessonSlug: "mongo-crud", userId: "u_1002", action: "view", viewCount: 0, at: new Date() },
{ lessonSlug: "mongo-intro", userId: "u_1001", action: "complete", viewCount: 1, at: new Date() }
])
db.lesson_logs.countDocuments() // 应为 3
步骤 2:查询
// 查全部(仅练习库数据少时这么干;生产查询必须带条件)
db.lesson_logs.find()
// 带条件 + 只取一条
db.lesson_logs.findOne({ userId: "u_1001", action: "complete" })
应看到:find 返回游标,mongosh 自动打印前 20 条;findOne 直接返回文档或 null。
步骤 3:更新——必须用运算符
const id = db.lesson_logs.findOne(
{ userId: "u_1001", lessonSlug: "mongo-crud" }
)._id
db.lesson_logs.updateOne(
{ _id: id },
{
$set: { action: "complete" }, // 设置 / 新增字段
$inc: { viewCount: 1 }, // 数值原子自增(字段不存在从 0 开始)
$currentDate: { updatedAt: true } // 写入服务器当前时间
}
)