Skip to content

MongoDB

MongoDB 是文档型数据库,使用 BSON 文档保存数据。它不像关系型数据库那样强依赖固定表结构,更适合字段变化较多、文档天然聚合、读写吞吐要求较高的场景。

为什么需要 MongoDB

有些业务数据天然就是一个完整文档,例如商品详情、用户画像、文章草稿、埋点事件。它们字段多、结构会变、嵌套层级明显,如果全部拆成很多关系表,读一次详情可能要多次 join。MongoDB 允许把经常一起读取的数据放在同一个文档里,读取时更贴近业务对象。

但 MongoDB 不是“不用设计表结构”。如果文档无限增长、索引缺失、字段命名混乱,性能和维护成本一样会失控。

核心概念

MongoDB类比关系型数据库说明
databasedatabase数据库
collectiontable集合
documentrow文档
fieldcolumn字段
indexindex索引

文档模型

mermaid
flowchart TD
    A[Database] --> B[Collection: user]
    B --> C[Document 1]
    B --> D[Document 2]
    C --> E[name/age/address/tags]

目录

如果你想检查自己是否真的从零基础学懂到能面试、能落地、能排查,按 MongoDB 从零到精通验收清单 逐项验收。它会把 BSON、文档建模、嵌入引用、索引、explain、聚合、副本集、分片、事务和商业选型串起来。

适合场景

  • 商品详情、用户画像这类字段变化较多的数据。
  • 日志、埋点、事件数据。
  • 内容管理系统。
  • 需要保存嵌套结构的业务对象。

不适合场景

  • 强事务、强关联、多表复杂 join 的核心交易系统。
  • 数据结构非常稳定并且高度关系化的业务。
  • 需要大量跨集合复杂查询的场景。

读写流程

mermaid
flowchart TD
    A["应用请求"] --> B["MongoDB Driver"]
    B --> C["目标 Collection"]
    C --> D{"是否命中索引?"}
    D -->|是| E["快速定位文档"]
    D -->|否| F["扫描集合"]
    E --> G["返回 BSON 文档"]
    F --> G

学习建议:先掌握文档模型和基础 CRUD,再学习索引和聚合。MongoDB 的重点不是“完全不设计结构”,而是根据查询方式设计合理文档。

命令 Demo:创建集合并查询

javascript
use blog

db.article.insertOne({
  title: "MongoDB 入门",
  author: "Tom",
  tags: ["database", "mongodb"],
  createdAt: new Date()
})

db.article.createIndex({ title: 1 })

db.article.find({
  title: /MongoDB/
})

这个 Demo 覆盖了 MongoDB 入门最核心的操作:选择数据库、插入文档、创建索引、按条件查询。

常见风险

风险后果建议
把 MongoDB 当成随便存 JSON字段混乱,查询和维护困难维护集合字段规范
不建索引大集合查询变成全表扫描explain 验证索引命中
无限数组放入单文档文档越来越大,更新变慢无限增长数据拆集合
跨集合复杂关联很多应用层 join 成本高强关系业务优先考虑关系库