MongoDB 面试八股文
·
1. MongoDB 是什么?
MongoDB 是一个开源的、面向文档的 NoSQL 数据库。它不使用传统的表和行结构,而是将数据存储为类似 JSON 的文档(BSON 格式)。这种数据模型使得可以将复杂的数据结构(如嵌套对象和数组)作为一个单一的实体来存储,非常适合现代应用程序的开发。
2. MongoDB 有哪些特点?
- 面向文档:数据以文档形式存储,是 NoSQL 中最接近面向对象思维的数据模型。
- 灵活的 schema:同一个集合(Collection,类似于表)中的文档不需要具有相同的字段集。可以动态修改文档结构,适应快速迭代的开发需求。
- 高性能:数据模型、索引、复制和分片等特性共同提供了出色的读写性能。
- 高可用性:通过副本集(Replica Set) 提供自动故障转移。数据在多个节点间复制,主节点故障时,系统会自动选举出新的主节点。
- 水平可扩展性:通过分片(Sharding) 将数据分布到多个服务器上,实现海量数据的存储和高吞吐量。
- 丰富的查询语言:支持丰富的查询、聚合、全文搜索、地理空间查询等。
- 索引支持:可以对任何字段建立索引,包括内嵌字段和数组,以优化查询速度。
3. NoSQL 数据库有哪些类型?
NoSQL 数据库主要分为以下四种类型:
- 文档型数据库:以文档为单位存储数据(如 JSON/BSON)。代表:MongoDB, CouchDB。
- 键值型数据库:使用简单的键值对存储数据,非常适合缓存和会话存储。代表:Redis, DynamoDB。
- 列族数据库:以列族为单位存储数据,适合分析大量数据集。代表:Cassandra, HBase。
- 图数据库:使用图结构(节点、边、属性)来存储数据,擅长处理复杂的关系。代表:Neo4j。
4. MySQL 与 MongoDB 之间最基本的差别是什么?
最根本的差别在于数据模型:
- MySQL 是关系型数据库(RDBMS),采用表格结构。数据存储在预定义结构的行和列中,表与表之间通过外键关联。它遵循严格的 schema。
- MongoDB 是非关系型数据库(NoSQL),采用文档模型。数据存储在类似 JSON 的文档中,文档可以包含嵌套结构,schema 是灵活的。
5. MongoDB 成为最好 NoSQL 数据库的原因是什么?
“最好”是相对的,但 MongoDB 之所以非常流行,成为许多开发者的首选,主要原因包括:
- 开发友好:文档模型与编程语言中的对象模型非常匹配,大大简化了开发。
- 强大的生态系统和工具:拥有成熟的图形化管理工具(如 MongoDB Compass)、云服务(Atlas)和活跃的社区。
- 平衡的综合性:在灵活性、性能、可扩展性和功能丰富性之间取得了很好的平衡。它既提供了 NoSQL 的灵活性,又通过副本集和分片提供了企业级数据库所需的可靠性和扩展能力。
- 学习曲线平缓:对于有 SQL 背景的开发者来说,MongoDB 的查询语言和概念相对容易上手。
6. 你怎么比较 MongoDB、CouchDB 及 CouchBase?
| 特性 | MongoDB | CouchDB | CouchBase |
|---|---|---|---|
| 数据模型 | 文档型 | 文档型 | 文档型 + 键值型 |
| 一致性默认 | 强一致性(单文档) | 最终一致性 | 强一致性 |
| 查询方式 | 丰富的自定义查询和聚合框架 | 主要使用预定义的 MapReduce 视图 | SQL-like 查询语言(N1QL)和键值操作 |
| 扩展方式 | 分片(水平扩展) | 主主复制(多主同步) | 内置自动分片(水平扩展) |
| 主要应用场景 | 需要灵活 schema 和高性能读写的通用 Web 应用 | 支持离线操作的同步场景(如移动应用) | 需要极高吞吐量和低延迟的交互式应用(如缓存、会话存储) |
简单总结:MongoDB 是通用性最强的选择;CouchDB 在数据同步方面有独特优势;CouchBase 在性能上(尤其是低延迟读写)表现更突出。
7. 分析器在 MongoDB 中的作用是什么?
MongoDB 的分析器(Profiler) 是一个用于诊断数据库性能的工具。它可以记录和展示数据库中正在执行的慢查询和所有操作的详细信息。
- 作用:通过分析器,开发者可以找出哪些查询或写操作执行缓慢、消耗了大量资源,从而有针对性地进行索引优化或查询重写。
- 设置:可以设置一个慢操作阈值(例如 100 毫秒),所有超过该阈值的操作都会被记录下来。
8. 如何执行事务 / 加锁?
-
加锁机制:MongoDB 使用多粒度锁,允许操作在全局、数据库、集合或文档级别上锁定资源。从 MongoDB 3.2 版本开始,WiredTiger 存储引擎默认使用文档级锁,这意味着写操作只需要锁定单个文档,而不是整个集合,大大提高了并发性能。
-
事务执行:
- 单文档操作:在单个文档内的操作是原子性的,可以视为天然的事务。
- 多文档事务:自 MongoDB 4.0 版本开始,MongoDB 支持多文档 ACID 事务(最初在副本集中支持,4.2 版本后支持分片集群)。使用方式与关系型数据库类似,通过
session.startTransaction(),session.commitTransaction()和session.abortTransaction()来执行。
9. MongoDB 支持存储过程吗?如果支持的话,怎么用?
是的,MongoDB 支持类似存储过程的功能,但它不是用 SQL 编写的,而是用 JavaScript 编写的。
- 实现方式:可以通过
db.system.js.save()将 JavaScript 函数保存为数据库的服务器端 JavaScript 函数。然后,可以使用db.eval()来调用这些函数。 - 更现代的用法:虽然
db.eval()存在安全和性能问题(会持有写锁,阻塞其他操作),不推荐使用。更常见的做法是:- 将常用的业务逻辑封装在应用层代码中。
- 使用 MongoDB 的聚合管道(Aggregation Pipeline) 来实现复杂的数据处理逻辑,这是一种更强大、更高效且推荐的方式。
更多推荐
所有评论(0)