MongoDB常见面试题(上)
MongoDB常见面试题(上)
MongoDB 是一个广泛使用的 NoSQL 数据库,它以高性能、灵活的存储方式和可扩展性在许多应用中占据了重要位置。在面试 MongoDB 相关岗位时,常见的面试题目会涉及其基本概念、存储结构、应用场景、聚合查询、事务等方面。以下是 MongoDB 常见面试题总结(上),将帮助你深入理解 MongoDB 的基本功能和特性。
1. MongoDB 是什么?
MongoDB 是一个开源的、基于文档的 NoSQL 数据库。它使用 BSON(Binary JSON)格式存储数据,支持灵活的数据模型。与关系型数据库不同,MongoDB 使用集合(collection)来存储文档(document),并且不需要预定义的模式(schema),这使得它非常适合快速变化的数据结构。
特点:
- 高性能:MongoDB 提供高吞吐量的读写操作,支持大规模数据存储。
- 水平扩展:支持数据分片(sharding),可以跨多个节点扩展。
- 灵活的数据模型:支持动态模式,数据存储格式为 BSON,可以包含嵌套数据结构。
- 强大的查询功能:支持复杂查询、索引、聚合和全文检索等。
2. MongoDB 的存储结构是什么?
MongoDB 的存储结构包括以下几个关键部分:
- 数据库(Database):一个 MongoDB 实例可以包含多个数据库。每个数据库包含多个集合。
- 集合(Collection):集合是 MongoDB 中的基本数据存储单元,类似于关系型数据库中的表。集合中的文档可以有不同的结构。
- 文档(Document):文档是 MongoDB 中的数据单元,类似于关系型数据库中的行。它是一个 BSON(Binary JSON)对象,支持嵌套结构。
MongoDB 使用的存储引擎是 WiredTiger,它提供了事务支持和压缩选项。
3. MongoDB 有什么特点?
MongoDB 具有以下主要特点:
- NoSQL 数据库:MongoDB 是一个非关系型数据库,专为高性能、海量数据处理设计。
- 灵活的数据模型:MongoDB 采用 BSON 格式来存储数据,支持复杂的数据类型如数组、嵌套对象。
- 支持水平扩展:通过分片,MongoDB 可以将数据分布到多个服务器上,支持高可用性和扩展性。
- 强大的查询功能:提供丰富的查询语言,包括简单查询、聚合查询、文本搜索、地理空间查询等。
- 内存映射存储引擎:通过内存映射文件的方式,MongoDB 提供了高效的数据访问机制。
- 自动负载均衡:集群模式下,MongoDB 会自动在分片间均衡负载,确保数据的高效访问。
4. MongoDB 适合什么应用场景?
MongoDB 适合以下应用场景:
- 大数据处理:MongoDB 可以处理大量的非结构化数据,适合大数据场景。
- 快速原型开发:由于 MongoDB 支持灵活的数据模型,可以快速实现原型开发。
- 内容管理和交付:MongoDB 适合存储和管理内容,如文章、用户生成内容等。
- 物联网(IoT)应用:物联网设备生成的时间序列数据非常适合用 MongoDB 存储。
- 社交媒体平台:MongoDB 的高扩展性使其适合处理社交媒体中不断增长的数据。
5. MongoDB 存储引擎
MongoDB 提供了几种不同的存储引擎来满足不同的需求:
- WiredTiger:默认存储引擎,支持多版本并发控制(MVCC)和压缩,适用于大部分工作负载。它基于 B+ Tree 结构进行数据存储和查询。
- MMAPv1:早期的存储引擎,支持内存映射文件,但没有 WiredTiger 高效。
- In-Memory:这种存储引擎将数据完全加载到内存中,适用于内存中操作的高性能需求。
WiredTiger 和 MMAPv1 的比较:
- WiredTiger 支持文档级别的锁,而 MMAPv1 是基于集合级别的锁。
- WiredTiger 支持数据压缩,可以减少磁盘使用。
- WiredTiger 适合高并发写入场景,而 MMAPv1 适合读多写少的场景。
6. MongoDB 支持哪些存储引擎?
MongoDB 从版本 3.0 开始支持多种存储引擎。常见的存储引擎包括:
- WiredTiger:默认存储引擎,支持压缩和文档级别的并发控制。
- MMAPv1:旧版存储引擎,支持内存映射文件,适用于读多写少的工作负载。
- In-Memory:适用于极高性能要求的应用,将数据完全存储在内存中,适合处理高速缓存等场景。
- MongoRocks:基于 RocksDB 的存储引擎,适用于需要高吞吐量和低延迟的场景。
7. WiredTiger 基于 LSM Tree 还是 B+ Tree?
WiredTiger 存储引擎使用 B+ Tree 作为其数据存储结构。B+ Tree 是一种自平衡的树结构,常用于数据库索引和查询优化,能够提供高效的查询性能。
为什么选择 B+ Tree:
- 高效的查询:B+ Tree 提供了快速的范围查询和单点查询,适用于 MongoDB 的大多数工作负载。
- 支持大规模数据存储:B+ Tree 可以高效地存储大量数据,并且支持动态更新。
LSM Tree(日志结构合并树)通常用于写密集型的系统,它通过批量合并写入的数据来减少磁盘 I/O,但它不适合 MongoDB 的主要应用场景。
8. MongoDB 聚合
MongoDB 提供强大的聚合功能,适用于复杂的数据处理任务。聚合操作允许你对数据进行过滤、分组、排序等操作。MongoDB 提供了多种执行聚合的方法:
- 聚合管道(Aggregation Pipeline):通过多个阶段的管道来处理数据,支持复杂的操作,如
$match、$group、$sort等。 - MapReduce:一种基于函数式编程的聚合方法,适用于需要自定义聚合逻辑的场景,但性能上通常不如聚合管道。
- 简单聚合操作:如
count、distinct、group等,可以用于基本的聚合任务。
常见聚合管道操作:
$match:用于过滤数据,类似于 SQL 中的 WHERE 子句。$group:用于按字段分组,类似于 SQL 中的 GROUP BY。$sort:排序操作,类似于 SQL 中的 ORDER BY。$project:用于字段选择和计算,类似于 SQL 中的 SELECT。
9. MongoDB 事务
MongoDB 从 4.0 版本开始支持多文档事务,确保在多文档操作中维持一致性。事务可以确保在一组操作中,要么全部成功,要么全部失败。
事务特点:
- 支持 ACID 特性:即原子性、一致性、隔离性、持久性。
- 支持跨集合和跨数据库的操作。
- 支持回滚操作,保证数据的正确性。
事务使用:
- 在
session上开始事务,并在事务中执行多项操作。 - 在事务提交时,所有操作将生效。如果发生错误,可以回滚事务。
10. MongoDB 数据压缩
MongoDB 提供数据压缩功能,以减少磁盘空间的使用。默认情况下,WiredTiger 存储引擎支持数据压缩,压缩方式包括:
- Snappy:默认压缩算法,提供较高的压缩率和较快的压缩/解压缩速度。
- Zlib:提供更高的压缩比,但压缩速度较慢。
- Zstd:在性能和压缩比之间取得更好的平衡,适用于各种场景。
