CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
MongoDB 入门/课时/MongoDB 是什么
RawBlame
课时目录12 节

MongoDB 入门

  1. 01MongoDB 是什么
  2. 02安装与 mongosh
  3. 03文档与 BSON
  4. 04CRUD 操作
  5. 05查询与投影
  6. 06索引
  7. 07聚合管道
  8. 08Spring Data MongoDB
  9. 09何时用 Mongo vs SQL
  10. 10Docker 运行 MongoDB
  11. 11Node.js 驱动与 Mongoose
  12. 12综合练习

MongoDB 是什么

文档 vs 关系表、适用场景、本站 MySQL 主库说明。

25 分钟

MongoDB 是什么

这一课你将能做到

  1. 用自己的话向面试官说明 MongoDB 的定位与核心特征:它解决什么问题、不解决什么问题
  2. 写出一段含嵌套对象与数组的 BSON 风格文档,对照本站 cf_track 表指出至少 3 处建模差异
  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 …)
对比维度MongoDBMySQL
基本单元文档(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 里一次读齐。

步骤 2:对照本站 cf_track 表找差异

打开本地 codeforge 库的 cf_track(或看仓库 schema.sql),在笔记写三条差异:

  1. MySQL 列固定且带类型约束;Mongo 同一集合内字段可增减、可嵌套。
  2. 标签在 MySQL 需要额外的 tag 关联表(多对多);Mongo 一个 tags: [] 表达完毕。
  3. 课时列表在 MySQL 是 cf_lesson 多行;Mongo 可内嵌 lessons: [](大列表则用引用,文档课细讲)。

步骤 3:对三个场景做选型判断

对每个场景写「MySQL / MongoDB / 混合」并附一句理由:

  • 用户做题记录(字段随题型变化、追加写入多):偏 MongoDB——结构演进快、按用户或课程范围查询即可。
  • 支付订单与流水(强一致、要对账、有状态机):偏 MySQL——ACID 与约束生态成熟。
  • 课程目录与课时树(多表 JOIN、已有 JPA 实体与迁移脚本):留在 MySQL——已有资产与一致性要求都指向关系库。

写不出理由就回看上面的对比表,直到每条都能自圆其说。

步骤 4(可选):连通性探测

若本机已有 MongoDB 环境:

db.runCommand({ ping: 1 })   // 返回 { ok: 1 } 即连通

没有环境也没关系,下一课专门带你装。

讲清楚要点

  1. 基本单元是文档:一次读写一整份业务对象,减少 JOIN;代价是要认真设计内嵌深度,避免把一切塞进一个巨型文档。
  2. Schema 灵活 ≠ 没有结构:库层不强制同列,但应用层必须有字段约定(后续课的 @Document 与 Mongoose Schema 就是约束手段),否则查询与索引会失控。
  3. BSON 比 JSON 多类型:有 ObjectId、Date、Decimal128 等;别把 MongoDB 当成「存 JSON 文本的文件夹」。
  4. 单文档原子:对单个文档的更新天然原子——这是「把一起变的数据放同一个文档」这条建模原则的理论依据。
  5. 有事务不等于适合账本:4.0+ 支持多文档事务(需副本集环境),但外键约束、报表生态、运维习惯在关系库更成熟。
  6. 本站主库不变:学完本 track 也不迁移 cf_track;Mongo 承担做题日志、评论等扩展集合,练习固定用 coderoadmap_lab。

你可能会懵的地方

  • NoSQL 就是「没有 schema」吗? 库层不强制,应用层必须有约定。生产事故高发点不是「没 schema」,而是「没人记得文档里到底有哪些字段」。团队约定 + 应用层校验缺一不可。

  • MongoDB 和 Redis 什么关系?都要学吗? Redis 是内存键值库,偏缓存、会话、限流,数据可丢可重建;MongoDB 是持久化文档库,数据是业务资产。本站两者并存:Redis 挡热点读,Mongo 存文档型业务数据,互不替代。

  • 文档里嵌套无限深可以吗? 不行。单文档上限 16 MB;过大的数组、过深的嵌套还会让更新冲突与索引设计变难。内嵌 vs 引用的取舍在文档建模课展开。

  • 和 MySQL 的 JSON 列比呢? MySQL JSON 列适合「表里附带半结构化字段」的少量场景;整库按文档模型优化的查询、索引(含数组多键索引)与聚合管道是 MongoDB 的主场。

  • 面试被问「项目里为什么用 MongoDB」怎么答? 四段结构:数据形状(类 JSON、嵌套、字段演进快)→ 写入模式(追加为主、吞吐高)→ 查询模式(单对象整读、聚合统计)→ 边界(强一致账本仍在 MySQL)。背熟这个框架。

错法对照

错法问题正解
「Mongo 更先进,应全面替换 MySQL」忽略事务、JOIN、团队技能与已有资产按场景选型,主库不动
把 Mongo 当「只能存 JSON 文本」忽略 BSON 类型系统、索引与聚合能力按文档库特性建模与查询
练习直接写生产库名或生产账号污染真实数据固定用 coderoadmap_lab + 本地 Docker
一上来就学分片集群跳过单机基本功先 CRUD / 索引 / 聚合,再谈架构
所有字段拍平成顶层键丢失业务结构,字段爆炸用嵌套对象表达从属关系

卡点急救

  1. 分不清「文档模型」到底灵活在哪:拿一张 MySQL 宽表(几十个可空列)对比同一业务的一份 Mongo 文档——宽表每个新字段都要 ALTER 加回填,Mongo 直接写新字段即可;写一遍对比笔记,豁然开朗。
  2. 担心「灵活 schema 会失控」:把口号改成机制——「库层灵活、应用层强约束」。本 track 后续课里 Spring 的 @Document 实体与 Mongoose Schema 都是落点。
  3. 面试答不出适用场景:背三个关键词——「类 JSON 的嵌套数据」「字段演进快的业务」「追加型日志 / 评论」,再补一句「强一致账本不用它」,答案就完整了。

面试常问

  • MongoDB 是什么?有哪些特点? 面向文档的 NoSQL 数据库,以 BSON(二进制 JSON)存储数据。核心特点:schema 灵活、支持内嵌数组与对象;自带聚合管道与多种索引(含数组多键索引);原生支持副本集与分片扩展;单文档更新原子,4.0+ 支持多文档事务。适合灵活结构与高吞吐写入场景。

  • MongoDB 和 MySQL 的核心区别? 数据模型(文档 vs 关系行)、schema(动态 vs 固定)、关联表达(内嵌 / $lookup vs JOIN)、事务(单文档原子 vs 完整 ACID 传统)、扩展方式(内建分片 vs 生态方案)。选型看数据形状与一致性需求,没有绝对优劣。

  • 什么场景不适合 MongoDB? 强一致金融账本、复杂多表 JOIN 报表、依赖外键约束与存储过程的数据——关系库在这些点的生态与工具链更成熟,强行迁移只增加风险。

自测三问

  1. 用一句话区分 Collection 与 Table、Document 与 Row。
  2. 为什么本站课程元数据仍放在 MySQL?
  3. 举一个「硬拆多表反而难受、文档模型顺手」的业务例子。

小结一句话

MongoDB 用 BSON 文档承载灵活、嵌套的数据,是关系库的补充而非替代;本站权威数据在 MySQL,文档库承接做题日志与评论类扩展场景。

延伸

  • MongoDB Manual — Introduction
  • Documents 官方概念
  • 下一课:安装 MongoDB 并上手 mongosh。
加载本节练习…
下一课 →安装与 mongosh