第一章:MongoDB 简介与核心概念
最后更新: 2024-01-01
作者: MongoDB Team
页面目录
第一章:MongoDB 简介与核心概念
了解 MongoDB 的起源、设计理念和核心优势
1.1 什么是 MongoDB
MongoDB 是一个基于 文档(Document) 的 NoSQL 数据库,使用 BSON(Binary JSON) 格式存储数据。它由 MongoDB 公司开发,于 2009 年首次发布,以其高性能、高可用性和易扩展性著称。
核心特性
| 特性 | 说明 |
|---|---|
| 文档存储 | 数据以灵活的 BSON 文档形式存储 |
| 高性能 | 内置索引支持,查询性能优异 |
| 高可用 | 副本集提供自动故障转移和数据冗余 |
| 水平扩展 | 分片集群支持海量数据分布式存储 |
| 动态模式 | 同一集合的文档可以有不同的字段结构 |
| 丰富查询 | 支持丰富的查询表达式和聚合操作 |
1.2 MongoDB vs 关系型数据库
┌─────────────────────────────────────────────────────────────┐
│ MongoDB 与 RDBMS 对比 │
├─────────────────┬──────────────────┬────────────────────────┤
│ 概念 │ MongoDB │ MySQL/PostgreSQL │
├─────────────────┼──────────────────┼────────────────────────┤
│ 数据库 │ Database │ Database │
│ 表/集合 │ Collection │ Table │
│ 行/文档 │ Document │ Row │
│ 列/字段 │ Field │ Column │
│ 主键 │ _id (自动生成) │ Primary Key │
│ 索引 │ Index │ Index │
│ 关联 │ Embedded/Link │ JOIN │
│ 事务 │ ACID (单分片) │ ACID (全局) │
└─────────────────┴──────────────────┴────────────────────────┘
1.3 BSON 数据类型
MongoDB 使用 BSON 作为存储格式,BSON 是 JSON 的二进制表示,支持更多数据类型:
常用数据类型
| 类型 | 说明 | 示例 |
|---|---|---|
String |
UTF-8 字符串 | "Hello MongoDB" |
Integer |
32/64 位整数 | 42, 9223372036854775807 |
Double |
64 位浮点数 | 3.14159 |
Boolean |
布尔值 | true, false |
Object |
内嵌文档 | { name: "Alice" } |
Array |
数组 | [1, 2, 3] |
Null |
空值 | null |
Date |
日期时间 | ISODate("2024-01-01") |
ObjectId |
文档 ID | ObjectId("...") |
Binary Data |
二进制数据 | 二进制 blob |
Timestamp |
时间戳 | 内部使用 |
Regular Expression |
正则表达式 | /pattern/i |
示例文档
{
"_id": ObjectId("507f1f77bcf86cd799439011"),
"username": "john_doe",
"email": "john@example.com",
"age": 28,
"is_active": true,
"profile": {
"first_name": "John",
"last_name": "Doe",
"bio": "Software Engineer",
"avatar": "https://example.com/avatar.jpg"
},
"skills": ["JavaScript", "Python", "MongoDB"],
"created_at": ISODate("2024-01-01T00:00:00Z"),
"updated_at": ISODate("2024-01-15T12:30:00Z"),
"settings": {
"theme": "dark",
"notifications": true,
"language": "zh-CN"
}
}
1.4 MongoDB 架构概览
┌─────────────────────────────────────────────────────────────┐
│ MongoDB 架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
│ │ Router │ │ Router │ │ Router │ mongos │
│ │ (mongos) │ │ (mongos) │ │ (mongos) │ │
│ └─────┬─────┘ └─────┬─────┘ └─────┬─────┘ │
│ │ │ │ │
│ └──────────────┼──────────────┘ │
│ │ │
│ ┌────────────────────┴────────────────────┐ │
│ │ Config Server │ │
│ │ (配置分片和集群元数据) │ │
│ └────────────────────┬────────────────────┘ │
│ │ │
│ ┌─────────────────┼─────────────────┐ │
│ │ │ │ │
│ ┌──┴───┐ ┌──┴───┐ ┌──┴───┐ │
│ │Shard1│ │Shard2│ │Shard3│ │
│ │ RS │ │ RS │ │ RS │ 分片副本集 │
│ └──┬───┘ └──┬───┘ └──┬───┘ │
│ │ │ │ │
│ ┌──┴───┐ ┌──┴───┐ ┌──┴───┐ │
│ │Sec. 1│ │Sec. 1│ │Sec. 1│ │
│ │Sec. 2│ │Sec. 2│ │Sec. 2│ │
│ │Arb. │ │Arb. │ │Arb. │ │
│ └──────┘ └──────┘ └──────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
1.5 MongoDB 应用场景
适用场景
| 场景 | 说明 | 示例 |
|---|---|---|
| 内容管理系统 | 灵活的数据结构 | 文章、评论、用户生成内容 |
| 实时分析 | 高并发读写 | 日志分析、实时监控 |
| 物联网 (IoT) | 海量时序数据 | 传感器数据、设备日志 |
| 移动应用 | 快速迭代 | 用户数据、离线同步 |
| 电子商务 | 商品目录、订单 | 产品属性灵活多变 |
| 社交网络 | 用户关系、动态 | 朋友圈、评论系统 |
不适用场景
| 场景 | 原因 |
|---|---|
| 强事务场景 | 需要跨文档 ACID 事务(MongoDB 4.0+ 已支持单分片事务) |
| 高度结构化数据 | 需要复杂 JOIN 操作的数据 |
| 低延迟简单查询 | 简单 KV 场景 Redis 更合适 |
1.6 MongoDB 版本历史
| 版本 | 发布年份 | 主要特性 |
|---|---|---|
| 1.0 | 2009 | 初始版本 |
| 2.0 | 2011 | 副本集、TTL 索引 |
| 2.6 | 2014 | 文本搜索、聚合增强 |
| 3.0 | 2015 | WiredTiger 存储引擎 |
| 3.4 | 2016 | 分布式事务、视图 |
| 4.0 | 2018 | 多文档事务、Retryable Writes |
| 4.2 | 2019 | 分布式事务、聚合增强 |
| 4.4 | 2020 | 变更流增强、hashed 分片 |
| 5.0 | 2021 | 时间序列集合、实时重新分片 |
| 6.0 | 2022 | 集合级加密、聚合增强 |
| 7.0 | 2024 | 查询able 加密、改进的分片 |
1.7 常用工具
| 工具 | 说明 |
|---|---|
mongosh |
MongoDB Shell,命令行客户端 |
mongod |
MongoDB 数据库服务进程 |
mongos |
分片集群路由进程 |
mongodump |
数据库备份工具 |
mongorestore |
数据库恢复工具 |
mongoexport |
导出为 JSON/CSV |
mongoimport |
从 JSON/CSV 导入 |
MongoDB Compass |
图形化管理工具 |
MongoDB Atlas |
云数据库服务 |
💡 实践提示
- 理解文档模型:MongoDB 的核心是文档,理解如何设计文档结构是关键
- 避免过度嵌套:虽然可以嵌套文档,但深层嵌套会影响查询性能
- 合理使用引用:对于需要频繁关联的数据,使用 DBRef 或手动引用
- 关注版本兼容性:开发时注意 MongoDB 版本,避免使用不支持的特性
📚 继续学习