MongoDB在Java面试题中经常被问到,下面就给大家总结一份比较全面的MongoDB面试题及答案。
什么是MongoDB?
MongoDB是一个文档数据库,是一个非关系性数据库 , 具体高性能 、高扩展、文档性 ,是目前NoSQL中最热门的数据库。
什么叫文档数据库?
MongoDB提出的是文档的概念,是采用BSON存储文档数据,并不是我们理解的PDF 、或者Word文档。
BSON是类JSON作为其数据模型结构,比如:
{ username:'mikechen', password:'123456' }
使用这样的数据模型,使得MongoDB能在生产环境中提供高读写的能力,吞吐量较于mysql等SQL数据库大大增强。
什么是BSON?
BSON 是 Binary JSONopen in new window的简称,是 JSON 文档的二进制表示,支持将文档和数组嵌入到其他文档和数组中。
MongoDB 的存储结构是什么?
MongoDB 的存储结构区别于传统的关系型数据库,主要由如下三个单元组成:
1.文档Document
文档:是MongoDB 中最基本的单元,由 BSON 键值对(key-value)组成。
2.集合Collection
一个集合可以包含多个文档,类似于关系型数据库中的表Table。
3.数据库Database
一个数据库中可以包含多个集合,可以在 MongoDB 中创建多个数据库,类似于关系型数据库中的数据库(Database)。
文档、集合、数据库的关系
MongoDB 将数据记录存储为文档,更具体来说是BSON 文档,这些文档在集合中聚集在一起,数据库中存储一个或多个文档集合。
MongoDB的主要特性?
1.文档数据库
MongoDB没有SQL类型的数据库是正规化的等约束条件,从而使得MongoDB存储数据结构更灵活,存储速度更加快。
2.即时查询能力
MongoDB保留了关系型数据库即时查询的能力,保留了索引的能力,相比于同类型的NoSQL Redis 并没有上述的能力。
3.复制能力
MongoDB自身提供了副本集,将数据分布在多台机器上实现冗余,目的是可以提供自动故障转移,以及扩展读能力。
4.速度与持久性
MongoDB的驱动实现一个写入语义 fire and forget ,即通过驱动调用写入时,可以立即得到返回得到成功的结果,这样让写入的速度更加快。
MongoDB提供了Journaling日志的概念,实际上像mysql的bin log日志。
MongoDB当需要插入的时候,会先往日志里面写入记录,再完成实际的数据操作,这样如果出现停电或者进程突然中断,可以通过修复功能读取Journaling日志进行修复。
5.数据扩展
MongoDB使用分片技术,对数据进行扩展,MongoDB能自动分片,以及自动转移分片里面的数据块。
为什么要采用MongoDB?
- 建模灵活;
- 面向文档的存储:以 JSON 格式的文档保存数据;
- 横向扩展简单;
- 大数据量存储;
- 适用于高并发;
- 丰富的查询功能;
MongoDB的应用场景?
- 大数据;
- 内容管理系统;
- 移动端Apps;
- 数据管理;
MongoDB支持哪些数据类型?
- String;
- Integer;
- Double;
- Boolean;
- Object、Object ID;
- Arrays;
- Min/Max Keys;
- Datetime;
- Code;
- Regular Expression等;
MongoDB中的分片是什么?
在多台计算机上存储数据记录的过程称为分片,这是一种MongoDB快速满足数据增长的方法。
分片它是数据库,或搜索引擎中数据的水平分区,每个分区称为分片,或数据库分片。
MongoDB分片策略有哪些?
MongoDB 支持两种分片算法来满足不同的查询需求:基于范围的分片、基于 Hash 值的分片。
1.基于范围的分片
如下图所示:
MongoDB 按照分片键的值的范围,将数据拆分为不同的块Chunk,每个块包含了一段范围内的数据。
2.基于 Hash 值的分片
如下图所示:
MongoDB 计算单个字段的哈希值作为索引值,并以哈希值的范围,将数据拆分为不同的块Chunk。
什么是分片集群?
分片集群是 MongoDB 的分布式版本,分片集群数据被均衡的分布在不同分片中。
分片集群的作用:不仅大幅提升了整个集群的数据容量上限,也将读写的压力分散到不同分片,以解决副本集性能瓶颈的难题。
分片集群组成?
MongoDB 的分片集群由如下三个部分组成:
Config Servers:配置服务器,负责存储集群的各种元数据和配置,比如:分片地址、Chunks 等;
Mongos:路由服务,不存具体数据,从 Config 获取集群配置讲请求转发到特定的分片;
Shard:每个分片是整体数据的一部分子集;
分析器在MongoDB中的作用是什么?
MongoDB可以通过分析器找到比预期慢的查询,或者写的操作等,用这一信息可以确定是否需要添加索引,从而提升查询效率。
在MongoDb中什么是索引?
和关系型数据库类似,MongoDB 中也有索引,索引的目的主要是用来提高查询效率。
如果没有索引的话,没有索引的MongoDB将扫描整个集合中的所有文档 ,这种扫描效率很低。
虽然索引可以显著缩短查询时间,但是使用索引和维护索引也是有代价的,在执行写入操作时,除了要更新文档之外,还必须更新索引。
MongoDB 支持哪些类型的索引?
MongoDB 支持多种类型的索引,主要包含如下7种索引:
- 单字段索引: 建立在单个字段上的索引;
- 复合索引: 建立在多个字段上的索引,也可以称之为组合索引或者联合索引;
- 多键索引 :MongoDB 的一个字段可能是数组,在对这种字段创建索引时就是多键索引;
- 哈希索引 :按数据的哈希值索引,就是哈希索引,主要用在哈希分片集群上;
- 文本索引: 支持对字符串内容的文本搜索查询,文本索引可以包含任何值为字符串,或字符串元素数组的字段;
- 地理位置索引: 基于经纬度的索引,适合 2D 和 3D 的位置查询;
- 唯一索引 :确保索引字段不会存储重复值;
什么是 TTL 索引?
TTL 索引提供了一个过期机制,允许为每一个文档,设置一个过期时间 expireAfterSeconds ,当一个文档达到预设的过期时间之后就会被删除。
数据过期对于某些类型的信息很有用,比如:日志等,这些信息只需要在数据库中保存有限的时间。
什么是复制集群?
MongoDB 的复制集群,又称为副本集群,是一组维护相同数据集合的 进程。
通常来说,一个复制集群包含 1 个主节点,多个从节点,以及零个或 1 个仲裁节点。
如下图所示:
主节点机负责整个复制集群的写,从节点可以进行读操作,主节点与备节点之间是通过 oplog(操作日志) 来同步数据。
SQL 与 MongoDB 常见术语对比?
SQL | MongoDB |
---|---|
表(Table) | 集合(Collection) |
行(Row) | 文档(Document) |
列(Col) | 字段(Field) |
主键(Primary Key) | 对象 ID(Objectid) |
索引(Index) | 索引(Index) |
嵌套表(Embeded Table) | 嵌入式文档(Embeded Document) |
数组(Array) | 数组(Array) |
MongoDB与MySQL的区别?
详细的区别,如下图所示:
![MongoDB面试题及答案(19道必考题图文解析)-mikechen MongoDB面试题及答案(19道必考题图文解析)-mikechen](https://static.mikechen.cc/wp-content/uploads/2022/12/mongodb-mysql-01.png)
作者简介
陈睿|mikechen,10年+大厂架构经验,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
👇阅读mikechen更多原创技术文章👇
阿里架构 |双11秒杀 |微服务 |云原生 |Docker |K8S |Kafka |分布式架构 |高并发架构
关注作者「mikechen」公众号,获取更多技术干货!
![](https://static.mikechen.cc/wp-content/uploads/2023/04/mikechen-gzh.png)
后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》