MongoDB  概念解析

markdown

MongoDB 核心概念全解析

从 SQL 思维 → MongoDB 思维(2025 年最新版)

MongoDB 是 文档型 NoSQL 数据库,其设计哲学是:“数据结构像代码一样灵活”
以下将 SQL 概念 ↔ MongoDB 概念 一一对应解析,带你从 0 建立完整认知。


一、核心概念对照表(SQL vs MongoDB)

SQL 概念MongoDB 概念说明类比
DatabaseDatabase数据库一样
TableCollection集合一张“表”,但无固定列
RowDocument文档一行数据,用 BSON/JSON 表示
ColumnField字段键值对,支持嵌套
Primary Key_id主键自动生成 ObjectId,唯一
IndexIndex索引提升查询性能
JOIN$lookup / 嵌套关联查询优先用嵌套,次选 $lookup
SchemaDynamic Schema动态结构无固定 Schema
// MongoDB 文档示例(相当于 SQL 一行)
{
  "_id": ObjectId("671f2a1b9d8e4c2a7f1b3d5e"),
  "name": "张三",
  "age": 28,
  "address": {
    "city": "北京",
    "zip": "100000"
  },
  "hobbies": ["阅读", "编程"],
  "isActive": true
}

二、核心概念深度解析

1. Database(数据库)

  • 逻辑容器,隔离不同项目数据。
  • 一个 MongoDB 实例可包含多个数据库。
  • 默认数据库:adminlocalconfig
use company      // 切换到 company 数据库(不存在则自动创建)
show dbs         // 列出所有数据库

2. Collection(集合)

  • 相当于 SQL 的“表”,但 无 Schema 约束
  • 同一个集合中,文档可以结构完全不同。
  • 命名规则:
  • 不能为空
  • 不能包含 \0(空字符)
  • 不能以 system. 开头(系统保留)
  • 建议使用小写 + 下划线(如 user_profiles
show collections
db.createCollection("logs")  // 可选,insert 会自动创建

3. Document(文档)

  • 核心存储单元,BSON 格式(Binary JSON)。
  • 最大大小:16 MB(适合大多数业务)。
  • 支持 嵌套文档数组,天然表达复杂关系。
// 嵌套文档
{
  "user": {
    "profile": { "name": "李四", "age": 25 },
    "settings": { "theme": "dark" }
  }
}

// 数组
{
  "tags": ["mongodb", "nosql", "database"],
  "scores": [98, 87, 92]
}

4. _id(主键)

  • 每个文档 必须有 _id 字段。
  • 默认自动生成 ObjectId(12 字节):
  • 4 字节时间戳 + 5 字节随机值 + 3 字节计数器
  • 天然递增全局唯一
  • 可自定义,但必须唯一。
// 自动生成
db.users.insertOne({ name: "王五" })

// 自定义 _id
db.users.insertOne({ _id: "U001", name: "赵六" })

5. BSON(Binary JSON)

  • MongoDB 内部存储格式,比 JSON 更高效。
  • 支持类型:null, boolean, number, string, array, object, ObjectId, Date, Binary, Regex 等。
  • 优势:
  • 支持二进制数据(图片、文件)
  • 遍历更快
  • 支持更多数据类型
// BSON 类型示例
{
  "_id": ObjectId("..."),
  "birthday": ISODate("1995-03-15T00:00:00Z"),
  "active": true,
  "score": 95.5,
  "binary": BinData(0, "base64string...")
}

6. Schema 设计哲学

SQL 思维MongoDB 思维
规范化(范式)反规范化(嵌套)
多表 JOIN单文档嵌套$lookup
固定列动态字段
// 推荐:嵌套(读多写少)
{
  "order_id": "O001",
  "customer": {
    "name": "张三",
    "phone": "138..."
  },
  "items": [
    { "name": "手机", "price": 5999 },
    { "name": "耳机", "price": 999 }
  ]
}

// 不推荐:多集合 JOIN(除非数据量大)
orders → customers → order_items

三、进阶概念

1. Capped Collection(固定集合)

  • 大小固定,先进先出(FIFO),类似日志。
  • 高性能写入,适合日志、缓存。
db.createCollection("logs", { capped: true, size: 1048576, max: 1000 })

2. GridFS(大文件存储)

  • 存储 > 16MB 的文件(如视频、图片)。
  • 自动分片为 fs.files(元数据) + fs.chunks(数据块)。
// 使用 mongofiles 工具
mongofiles put video.mp4

3. Change Streams(变更流)

  • 实时监听集合变更(插入、更新、删除)。
  • 类似 MySQL Binlog,用于同步、审计。
const changeStream = db.collection.watch();
for await (const change of changeStream) {
  printjson(change);
}

4. Time Series Collections(时序集合)

  • 专为 IoT、监控、日志优化。
  • 自动分区,按时间排序,压缩率高。
db.createCollection("sensor_data", {
  timeseries: {
    timeField: "timestamp",
    metaField: "metadata",
    granularity: "minutes"
  }
})

5. Vector Search(向量搜索,7.0+)

  • 支持 AI 向量相似性搜索(embedding)。
  • 用于推荐、语义搜索。
db.vectors.createIndex({ embedding: "vectorSearch" })

四、MongoDB 架构概念

概念说明
Instance一个 mongod 进程
Replica Set主从复制集群(高可用)
Sharding分片集群(水平扩展)
Config Server分片元数据存储
Mongos分片路由器
AtlasMongoDB 云服务(全托管)
单节点 → Replica Set → Sharded Cluster → Atlas

五、查询与操作概念

操作命令
插入insertOne, insertMany
查询find, findOne
更新updateOne, updateMany, replaceOne
删除deleteOne, deleteMany
聚合aggregate(管道:$match, $group, $lookup, $unwind
索引createIndex, dropIndex
// 聚合管道示例:统计各城市用户数
db.users.aggregate([
  { $group: { _id: "$city", count: { $sum: 1 } } },
  { $sort: { count: -1 } }
])

六、索引类型

类型用途
单字段索引{ age: 1 }
复合索引{ age: 1, name: -1 }
文本索引{ content: "text" }
地理索引{ location: "2dsphere" }
TTL 索引{ createdAt: 1 } + expireAfterSeconds: 3600
部分索引partialFilterExpression
稀疏索引sparse: true

七、事务(4.0+)

  • 支持 多文档 ACID 事务(副本集 + 分片)。
  • 适用场景:转账、订单支付。
const session = db.getMongo().startSession()
session.startTransaction()
try {
  db.accounts.updateOne({id:1}, {$inc:{balance:-100}}, {session})
  db.accounts.updateOne({id:2}, {$inc:{balance:100}}, {session})
  session.commitTransaction()
} catch (e) {
  session.abortTransaction()
}

八、总结:MongoDB 概念思维导图

MongoDB
├── Database
│   └── Collection
│       └── Document (BSON)
│           ├── _id (ObjectId)
│           ├── Field (嵌套/数组)
│           └── Dynamic Schema
├── 架构
│   ├── Replica Set (高可用)
│   └── Sharding (高扩展)
├── 查询
│   ├── CRUD
│   ├── Aggregation Pipeline
│   └── Index
└── 高级
    ├── GridFS
    ├── Change Streams
    ├── Time Series
    └── Vector Search

九、一句话总结

MongoDB = “用 JSON 存数据,像操作对象一样操作数据库”


推荐学习路径

  1. 掌握 mongosh → 2. 设计嵌套文档 → 3. 学会聚合管道 → 4. 搭建副本集

如需 Schema 设计最佳实践性能调优索引策略从 MySQL 迁移到 MongoDB,欢迎继续提问!

文章已创建 2349

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部