← 返回知识宇宙
数据库·进阶

文档数据库入门:MongoDB 与 Couchbase

本教程系统讲解文档数据库核心概念,以 MongoDB 和 Couchbase 为代表,涵盖数据模型、CRUD 操作、查询与聚合、索引、副本集、分片、事务、多模型能力、选型对比及 Python 接入方法,帮助建立文档数据库全景认知。

知识编号31
关系轨道5
学习难度进阶
文档数据库MongoDBCouchbaseNoSQLJSONCRUD聚合管道索引事务N1QL
抖音

视频讲解

文档数据库入门:MongoDB 与 Couchbase

一个视频,讲透文档数据库,不用学几个月。


第一章 - 文档数据库是什么

这一个视频把文档数据库这一类讲完,重点对比两个代表:{{MongoDB}} 和 {{Couchbase}}。

一句话:文档数据库存的是{{ JSON 文档}},不是固定表格。字段可以随时加、结构随时变,特别适合结构多变、嵌套明显的数据。

对比关系型

关系型 SQL          文档数据库
表(固定列)         集合(文档可不同)
行                  文档(JSON 对象)
列                  字段(可嵌套)
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})

共同点与差异

维度MongoDBCouchbase
主键_idkey
顶层databasebucket(带内存配额)
文档格式BSONJSON

本章小结

两者都是"库 -> 集合 -> 文档",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 对比

维度MongoDBCouchbase
查询聚合管道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——都是"连客户端 -> 选库 -> 选集合 -> 增删改查"。


第十章 - 什么时候用文档数据库

适合

不适合

本章小结

文档数据库赢在灵活和嵌套;要强关联选 SQL,要极致速度的纯缓存选 Redis。


总结

实践示例

后续与前置知识

引用此知识点

更多数据库知识