Skip to content

3)MongoDB

🌱 第 1 题(基础认知)

Q1:MongoDB 是什么?与传统的关系型数据库(如 MySQL)有什么区别?

📝 标准答案:

MongoDB 是一个基于文档的、分布式、面向集合的 NoSQL 数据库,数据以 BSON(类似 JSON)格式存储。

与 MySQL 等关系型数据库的区别主要有:

维度MongoDBMySQL
数据结构文档(BSON)表(行列)
模式(Schema)无模式(Schema-less)固定模式
查询语言MongoDB 查询语法SQL
横向扩展原生支持 Sharding支持但需要额外组件
存储结构内嵌结构适合文档型数据扁平结构,适合强结构化数据

MongoDB 适用于快速开发、非结构化数据、文档型存储等场景。

🌿 第 2 题(数据操作)

Q2:你能说说 MongoDB 中插入、查询、更新、删除的基本操作语法吗?

📝 标准答案:

MongoDB 的基本 CRUD 操作如下:

  1. 插入文档
js
db.users.insertOne({ name: "Tom", age: 25 });
  1. 查询文档
js
db.users.find({ age: { $gt: 18 } }); // 查询 age > 18
  1. 更新文档
js
db.users.updateOne({ name: "Tom" }, { $set: { age: 26 } });
  1. 删除文档
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 用来设置数据的自动过期时间,这样系统会自动清理那些不再需要的数据。