3)MongoDB
🌱 第 1 题(基础认知)
Q1:MongoDB 是什么?与传统的关系型数据库(如 MySQL)有什么区别?
📝 标准答案:
MongoDB 是一个基于文档的、分布式、面向集合的 NoSQL 数据库,数据以 BSON(类似 JSON)格式存储。
与 MySQL 等关系型数据库的区别主要有:
维度 | MongoDB | MySQL |
---|---|---|
数据结构 | 文档(BSON) | 表(行列) |
模式(Schema) | 无模式(Schema-less) | 固定模式 |
查询语言 | MongoDB 查询语法 | SQL |
横向扩展 | 原生支持 Sharding | 支持但需要额外组件 |
存储结构 | 内嵌结构适合文档型数据 | 扁平结构,适合强结构化数据 |
MongoDB 适用于快速开发、非结构化数据、文档型存储等场景。
🌿 第 2 题(数据操作)
Q2:你能说说 MongoDB 中插入、查询、更新、删除的基本操作语法吗?
📝 标准答案:
MongoDB 的基本 CRUD 操作如下:
- 插入文档
js
db.users.insertOne({ name: "Tom", age: 25 });
- 查询文档
js
db.users.find({ age: { $gt: 18 } }); // 查询 age > 18
- 更新文档
js
db.users.updateOne({ name: "Tom" }, { $set: { age: 26 } });
- 删除文档
js
db.users.deleteOne({ name: "Tom" });
MongoDB 查询语法类似 JSON,支持多种查询条件符(如 $gt
, $in
, $or
, $regex
等),并且支持链式聚合查询(aggregate pipeline)。
🌳 第 3 题(索引优化)
Q3:MongoDB 中的索引怎么使用?有哪些类型?你实际用过哪些?
📝 标准答案:
MongoDB 索引用于加速查询,类似于关系型数据库的索引。常见类型包括:
类型 | 说明 |
---|---|
单字段索引 | 对某个字段创建索引,如 { name: 1 } |
复合索引 | 对多个字段创建联合索引,如 { name: 1, age: -1 } |
唯一索引 | 保证字段值唯一,如 { email: 1, unique: true } |
哈希索引 | 用于分片键上的哈希分布 |
地理空间索引 | 支持地理位置查询,如 2dsphere |
TTL 索引 | 设置过期时间,常用于临时数据,如登录态或验证码 |
文本索引 | 用于全文搜索,支持中文分词(需配合分词器) |
在项目中我使用过:
- 单字段索引加速主键或常查字段;
- TTL 索引实现验证码 5 分钟自动失效;
- 复合索引优化分页查询;
- 唯一索引防止用户重复注册。
🌲 第 4 题(聚合查询)
Q4:MongoDB 的聚合(aggregation)是做什么的?你能举个复杂一点的聚合例子吗?
📝 标准答案:
MongoDB 的聚合框架用于数据统计、分组、过滤、转换,类似 SQL 的 GROUP BY + HAVING + JOIN + ORDER BY
。
它以 聚合管道(pipeline) 形式组织操作,常用步骤包括:
$match
:过滤;$group
:分组统计;$project
:指定输出字段;$sort
:排序;$lookup
:类似 SQL 的 JOIN;$unwind
:展开数组字段。
📌 示例:统计每个分类的文章数量,按时间倒序排列
js
db.articles.aggregate([
{ $match: { status: "published" } },
{ $group: { _id: "$category", total: { $sum: 1 } } },
{ $sort: { total: -1 } },
]);
📌 示例:用 $lookup
进行“用户-订单”联表查询:
js
db.orders.aggregate([
{
$lookup: {
from: "users",
localField: "userId",
foreignField: "_id",
as: "userInfo",
},
},
{ $unwind: "$userInfo" },
{ $project: { orderNo: 1, "userInfo.name": 1 } },
]);
🪵 第 5 题(分片与高可用)
Q5:MongoDB 如何实现分片和副本集?在高并发场景下该怎么设计?
📝 标准答案:
MongoDB 实现高可用和高扩展性的两个核心机制:
✅ 副本集(Replication):
- 是 MongoDB 的主从复制机制,包含:
- 1 个主节点(Primary);
- N 个从节点(Secondary);
- 主节点写入数据,从节点异步复制;
- 当主挂掉时会自动选举新主(自动故障恢复);
- 提高了数据高可用性与容灾能力。
📌 场景:构建高可用服务,不丢数据。
✅ 分片(Sharding):
- MongoDB 的分布式存储方案;
- 数据被 按分片键(shard key) 水平切分;
- 每个分片是一个独立的副本集;
- 由 mongos 路由器负责请求路由;
- 分片策略:
- Range(范围分片)
- Hash(哈希分片)
- Zone(定向分片)
📌 场景:用户量大、单表数据千万级、热点查询打散。
🧠 高并发设计建议:
- 选择合适分片键,避免热点写入;
- 开启写入确认(write concern);
- 读写分离策略,读优先 secondary;
- 注意聚合查询的分片兼容性;
- 使用 TTL 自动清理无用数据。
- TTL 全称是 Time To Live,直译过来就是生存时间。在数据库中,尤其是像 Redis 这样的键值存储中,TTL 用来设置数据的自动过期时间,这样系统会自动清理那些不再需要的数据。