MongoDB 是什么
文档 vs 关系表、适用场景、本站 MySQL 主库说明。
MongoDB 是什么
这一课你将能做到
- 用自己的话向面试官说明 MongoDB 的定位与核心特征:它解决什么问题、不解决什么问题
- 写出一段含嵌套对象与数组的 BSON 风格文档,对照本站
cf_track表指出至少 3 处建模差异 - 对做题记录、支付流水、课程目录三类场景做出「MySQL / MongoDB」选型判断,并给出可辩护的理由
为什么要学
后端面试几乎必问 NoSQL,而 MongoDB 是出现频率最高的一个。实际工作中它常被用来承接评论、行为日志、审计记录、配置树这类「长得像 JSON、字段还会随版本迭代变」的数据。
人话:MongoDB = 把一整份「JSON 对象」当作一行存进去的数据库。MySQL 要先设计好列、把业务拆成几张表,读取时再用 JOIN 拼回来;MongoDB 直接把业务对象整个放进去,读的时候一次拿齐。
但请钉死边界:本站(codeforge 学习平台)的权威数据——课程目录 cf_track、课时 cf_lesson、用户与做题进度——仍然在 MySQL,主路径是 Nginx → Spring Boot → MySQL,外加 Redis 做缓存。本 track 教你的是「何时把文档库引入技术栈、怎么用好它」,而不是「用它替换主库」。面试里能把这条边界讲清楚,比多背几个 API 有价值得多。
先建立图像
关系库(MySQL) 文档库(MongoDB)
Table(表) ↔ Collection(集合)
Row(行) ↔ Document(文档,BSON)
Column(列) ↔ Field(字段,可嵌套 / 数组)
JOIN ↔ 内嵌 / $lookup
SQL ↔ MQL(find / aggregate …)
| 对比维度 | MongoDB | MySQL |
|---|---|---|
| 基本单元 | 文档(BSON) | 行(固定列) |
| Schema | 灵活,同集合字段可不同 | 建表即定,改列要 ALTER |
| 关联表达 | 内嵌数组 / 对象,或 $lookup | 外键 + JOIN |
| 事务 | 单文档原子;4.0+ 多文档事务 | 成熟 ACID |
| 典型场景 | 日志、评论、嵌套对象 | 账本、目录、强关系数据 |
本站架构里三者的位置:
Nginx → Spring Boot → MySQL(cf_track 等权威数据)
├─ Redis(缓存 / 会话 / 限流)
└─ MongoDB(可选:做题日志、评论、审计等文档场景)
跟着做
步骤 1:抄一份「课程」文档,标出嵌套与数组
{
"_id": ObjectId("66f1a2b3c4d5e6f7a8b9c0d1"),
"slug": "mongodb-essentials",
"title": "MongoDB 入门",
"tags": ["mongodb", "nosql"],
"author": { "name": "codeforge", "level": 3 },
"lessons": [
{ "slug": "mongo-intro", "order": 1 },
{ "slug": "mongo-install", "order": 2 }
],
"createdAt": ISODate("2026-01-15T08:00:00Z")
}
在笔记里标出:tags 是数组、author 是嵌套对象、lessons 是对象数组。在 MySQL 里 lessons 通常是 cf_lesson 多行加外键,读一份课程要两次查询再拼装;在 Mongo 里一次读齐。