文档数据库入门:MongoDB 与 Couchbase
本教程系统讲解文档数据库核心概念,以 MongoDB 和 Couchbase 为代表,涵盖数据模型、CRUD 操作、查询与聚合、索引、副本集、分片、事务、多模型能力、选型对比及 Python 接入方法,帮助建立文档数据库全景认知。
视频讲解
文档数据库入门:MongoDB 与 Couchbase
一个视频,讲透文档数据库,不用学几个月。
第一章 - 文档数据库是什么
这一个视频把文档数据库这一类讲完,重点对比两个代表:{{MongoDB}} 和 {{Couchbase}}。
一句话:文档数据库存的是{{ JSON 文档}},不是固定表格。字段可以随时加、结构随时变,特别适合结构多变、嵌套明显的数据。
对比关系型
关系型 SQL 文档数据库
表(固定列) 集合(文档可不同)
行 文档(JSON 对象)
列 字段(可嵌套)
JOIN 关联 嵌入 或 引用
这一类数据库的共同点
- 存 JSON / BSON 文档,一个文档就是一个完整对象。
- Schema 灵活,不用先建表定列。
- 嵌套结构自然,不用拆表再 JOIN。
本章小结
文档数据库用 JSON 文档替代表和行,灵活是最大卖点。MongoDB 和 Couchbase 都属这一类。
第二章 - 数据模型:都是文档,分层不同
MongoDB 的分层
database(库)
└─ collection(集合,类似表)
└─ document(文档,有 _id 主键)
db.users.insertOne({ _id: 1, name: "Ada", age: 28, address: { city: "北京" } });
Couchbase 的分层
bucket(桶,一个数据库,可设内存)
└─ scope(作用域)
└─ collection(集合)
└─ document(文档,有 key 唯一标识)
collection.upsert("u1", {"name": "Ada", "age": 28})
共同点与差异
| 维度 | MongoDB | Couchbase |
|---|---|---|
| 主键 | _id | key |
| 顶层 | database | bucket(带内存配额) |
| 文档格式 | BSON | JSON |
本章小结
两者都是"库 -> 集合 -> 文档",MongoDB 用 _id,Couchbase 用 key 且顶层桶有内存配额。
第三章 - MongoDB:CRUD 与查询
增删改查
db.users.insertOne({ name: "Ada", age: 28 }); // 增
db.users.find({ age: { $gt: 28 } }); // 查
db.users.updateOne({ name: "Ada" }, { $set: { age: 29 } }); // 改
db.users.deleteOne({ name: "Ada" }); // 删
$set 改字段、$inc 自增、$push 加数组元素。忘写 $set 会整条文档被覆盖。
查询进阶
db.users.find({ age: { $gt: 28, $lte: 40 } }); // 范围
db.users.find({}, { name: 1, _id: 0 }); // 投影
db.users.find().sort({ age: -1 }).limit(10); // 排序限量
本章小结
MongoDB 用 {} 写条件、$ 操作符改字段,查询三件套是过滤、投影、排序。
第四章 - MongoDB:聚合与索引
聚合管道
db.orders.aggregate([
{ $match: { status: "paid" } },
{ $group: { _id: "$user_id", total: { $sum: "$amount" } } },
{ $sort: { total: -1 } },
{ $limit: 10 }
]);
管道 = $match -> $group -> $sort -> $limit,对应 SQL 的 WHERE + GROUP BY + ORDER BY + LIMIT。
索引
db.users.createIndex({ email: 1 }, { unique: true });
db.users.find({ email: "ada@x.com" }).explain();
本章小结
聚合用管道串起过滤/分组/排序,索引用 createIndex 建、explain 验证。
第五章 - MongoDB:副本集、分片、事务
副本集与分片
{{副本集}}几个节点存同一份数据,主挂自动选新主;{{分片}}把数据按分片键切到多台机器,水平扩展。
副本集: [主] <-> [从] <-> [从] 分片: 数据按 user_id 哈希切到多节点
多文档事务
单文档操作天然原子,跨文档才需要事务,且有性能代价:
const s = db.getMongo().startSession();
s.startTransaction();
try {
s.getDatabase("shop").accounts.updateOne({ _id: 1 }, { $inc: { balance: -100 } });
s.getDatabase("shop").accounts.updateOne({ _id: 2 }, { $inc: { balance: 100 } });
s.commitTransaction();
} catch (e) { s.abortTransaction(); }
本章小结
副本集保高可用、分片保扩展、事务兜底多文档原子——MongoDB 三件套。
第六章 - Couchbase:Key-Value 与 N1QL
多模型:既能 KV,也能 SQL
Couchbase 同一份数据,能用 key 直接取(最快),也能用 N1QL 用 SQL 语法查:
collection.get("u1") # Key-Value:O(1) 直达
SELECT name, age FROM `travel` WHERE age > 28; -- N1QL:SQL 查 JSON
N1QL 查询
SELECT name, address.city FROM `travel` WHERE address.city = '北京';
SELECT user_id, SUM(amount) AS total
FROM `travel` WHERE status = 'paid'
GROUP BY user_id HAVING SUM(amount) > 50 ORDER BY total DESC;
点号 address.city 直接穿透嵌套字段,不用 JOIN。
本章小结
Couchbase 是"内存版的多模型":KV 直达最快,N1QL 让会 SQL 的人直接上手。
第七章 - Couchbase:索引、内存优先、集群
二级索引(GSI)
CREATE INDEX idx_age ON `travel`(age);
EXPLAIN SELECT name FROM `travel` WHERE age > 28;
内存优先 + 持久化
数据常驻内存换极低延迟,异步落盘保持久化;副本保高可用,XDCR 跨数据中心容灾。
写入 -> 内存(快)-> 异步落盘
集群: [主] [副本] [副本] XDCR: 机房A <-> 机房B
本章小结
Couchbase 内存优先换低延迟,GSI 索引加速 N1QL,副本 + XDCR 保高可用。
第八章 - MongoDB vs Couchbase 对比
| 维度 | MongoDB | Couchbase |
|---|---|---|
| 查询 | 聚合管道 | N1QL(SQL)+ KV |
| 存储 | 磁盘为主 | 内存优先 |
| 一致性 | 副本集可调 | 可配持久化级别 |
| 生态 | 最大、教程最多 | 小众但性能强 |
| 适合 | 灵活文档、快速迭代 | 低延迟 + 多模型 |
一句话选型
要生态大、文档灵活选 {{MongoDB}};要极低延迟 + 还想写 SQL,选 {{Couchbase}}。
本章小结
MongoDB 胜在生态和灵活性,Couchbase 胜在内存低延迟和多模型。
第九章 - 用 Python 连接两者
MongoDB:pymongo
from pymongo import MongoClient
client = MongoClient("mongodb://localhost:27017")
users = client.shop.users
users.insert_one({"name": "Ada", "age": 28})
print(users.find_one({"name": "Ada"}))
Couchbase:couchbase SDK
from couchbase.cluster import Cluster
from couchbase.options import ClusterOptions
from couchbase.auth import PasswordAuthenticator
cluster = Cluster("couchbase://localhost",
ClusterOptions(PasswordAuthenticator("admin", "password")))
col = cluster.bucket("travel").default_collection()
col.upsert("u1", {"name": "Ada", "age": 28})
print(col.get("u1").content_as[dict])
本章小结
pymongo 连 MongoDB、couchbase SDK 连 Couchbase——都是"连客户端 -> 选库 -> 选集合 -> 增删改查"。
第十章 - 什么时候用文档数据库
适合
- 结构经常变:用户画像、商品详情、配置数据。
- 数据天然嵌套:订单里带一堆商品。
- 快速迭代,不想先定死表结构。
不适合
- 大量复杂 JOIN、强事务一致性 -> 关系型。
- 纯高频点查缓存 -> Redis 更快。
本章小结
文档数据库赢在灵活和嵌套;要强关联选 SQL,要极致速度的纯缓存选 Redis。
总结
- 核心回顾:文档数据库存 JSON 文档,灵活是卖点;MongoDB 靠聚合管道和最大生态,Couchbase 靠内存优先 + N1QL 多模型;两者都是库->集合->文档,用 Python SDK 连接;副本/分片/索引/事务是共同的基础设施。
- 学习路线:先本地 mongosh 练 MongoDB -> 再用 Docker 起 Couchbase 对比 -> 最后各写一个增删改查脚本。
- 推荐练习:① 用同一份"用户 + 订单"数据,分别在 MongoDB 和 Couchbase 里建模、查询;② 给两者建索引,用 explain 对比;③ 用 Python 各写一个 CRUD 脚本。
实践示例
MongoDB 增删改查(insertOne、find、updateOne、deleteOne)示例
MongoDB 聚合管道($match、$group、$sort、$limit)示例
Couchbase N1QL 查询与 Key-Value 操作示例
Python 使用 pymongo 连接 MongoDB 示例
Python 使用 couchbase SDK 连接 Couchbase 示例
MongoDB 副本集与分片架构示例
后续与前置知识
- 数据库导论:12 分钟看懂整个数据库世界前置
面向零基础学习者的数据库导论教程,12分钟建立数据库世界地图,覆盖为何需要数据库、OLTP vs OLAP、9类数据库系统(关系型、键值、文档、宽列、图、搜索、时序、OLAP、向量)、SQL vs NoSQL、共同框架(Schema、数据类型、CRUD、持久化、索引)、对象存储与数据库的区别,以及程序如何通过 Driver、Connection Pool、ORM 连接数据库。
- SQL 入门:从一张表看懂数据库相关
本文从一张表入手,系统讲解 SQL 数据库核心概念与操作,涵盖建库查数据、列记录主键、约束索引、DDL/DML/DQL/DCL/TCL 五类 SQL 语言、SELECT 聚合分组排序、JOIN 多表拼接、五大范式与反范式、事务与 ACID、视图索引权限、SQLite/PostgreSQL/MySQL 对比、Python 连接数据库、ORM 映射以及 DBeaver 图形化管理,适合快速建立 SQL 全景。
- Python 基础教程 · 10 分钟上手实操课前置
面向零基础初学者的 Python 实操教程,10 分钟从安装运行开始,讲解变量与数据结构、函数与模块、文件 I/O 与异常处理,最后实战完成 CSV 数据分析小工具。
- 命令行演示教程:10 分钟从图形界面走向键盘自由前置
面向零基础初学者的命令行实操教程,10 分钟从打开终端开始,讲解 Shell、Terminal、PATH 核心概念,演示文件系统操作、管道重定向与文本处理,并编写 Shell 脚本完成日志分析报告生成器。
- Docker 演示教程:一次打包,到处运行相关
面向初学者的 Docker 实操教程,10 分钟演示镜像与容器概念、Dockerfile 构建、Docker Compose 多服务编排、常用排错命令,并通过 Node.js + nginx + PostgreSQL 博客项目实战完成容器化部署。
引用此知识点
- 图数据库入门:Neo4j相关
本文系统讲解图数据库核心概念,以 Neo4j 为代表,涵盖节点、边、路径的数据模型,Cypher 图查询语言,多跳遍历与最短路径,社交网络、知识图谱、风控、推荐等典型场景,对比关系型数据库的 JOIN 查询,并演示使用 Python 驱动连接 Neo4j。
- 键值数据库入门:Redis 与 DynamoDB相关
本教程系统讲解键值数据库核心概念,以 Redis 和 DynamoDB 为代表,对比内存与云托管两种形态,涵盖 Redis 五种数据结构、过期持久化高可用、经典场景,DynamoDB 数据模型、主键设计、CRUD、二级索引、容量一致性、单表设计,并通过 Python 示例连接两者,最后给出选型建议与练习。
- 搜索数据库入门:Elasticsearch 与 OpenSearch相关
本教程系统讲解搜索数据库核心概念,以 Elasticsearch 与 OpenSearch 为代表,涵盖倒排索引、集群与索引/分片/副本数据模型、REST API 全文搜索、分词与 BM25 相关性排序、聚合分析、两者对比及 Python 接入方法,帮助建立搜索数据库全景认知。
- 时序数据库入门:InfluxDB 与 TimescaleDB相关
本文系统讲解时序数据库核心概念,以 InfluxDB 和 TimescaleDB 为代表,涵盖数据模型、Line Protocol 与 Flux/InfluxQL 查询、保留策略与降采样、超表与连续聚合/压缩、两者对比及 Python 接入方法,帮助建立时序数据库全景认知。
- 向量数据库入门:Qdrant、Milvus、Pinecone相关
本教程系统讲解向量数据库核心概念,以 Qdrant、Milvus、Pinecone 为代表,涵盖 Embedding 向量生成、余弦相似度搜索、ANN 近似最近邻索引(HNSW/IVF)、三者选型对比及 Python 连接方法,帮助快速建立向量数据库全景认知。
- 宽列数据库入门:Cassandra 与 ScyllaDB相关
本教程系统讲解宽列数据库核心概念,以 Cassandra 和 ScyllaDB 为代表,涵盖数据模型(分区键+列族)、CQL 与 CRUD、无主架构与可调一致性、LSM 树与建模、ScyllaDB 的 Shard-per-core 架构、两者对比、Python 连接及适用场景,帮助快速建立宽列数据库全景认知。