写点什么

三天吃透 MongoDB 面试八股文

作者:程序员大彬
  • 2023-03-23
    广东
  • 本文字数:5724 字

    阅读完需:约 19 分钟

本文已经收录到 Github 仓库,该仓库包含计算机基础、Java 基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎 star~


Github 地址:https://github.com/Tyson0314/Java-learning



mongodb 是什么?

MongoDB 是由 C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 再高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在给 WEB 应用提供可扩展的高性能数据存储解决方案。


MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。 MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

mongodb 有哪些特点?

(1)MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。


(2)你可以在 MongoDB 记录中设置任何属性的索引 (如: FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。


(3)你可以通过本地或者网络创建数据镜像,这使得 MongoDB 有更强的扩展性。


(4)如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。


(5)Mongo 支持丰富的查询表达式。查询指令使用 JSON 形式的标记,可轻易查询文档中内嵌的对象及数组。


(6)MongoDb 使用 update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。


(7)Mongodb 中的 Map/reduce 主要是用来对数据进行批量处理和聚合操作。


(8)Map 和 Reduce。 Map 函数调用 emit(key,value)遍历集合中所有的记录,将 key 与 value 传给 Reduce 函数进行处理。


(9)Map 函数和 Reduce 函数是使用 Javascript 编写的,并可以通过 db.runCommand 或 mapreduce 命令来执行 MapReduce 操作。


(10)GridFS 是 MongoDB 中的一个内置功能,可以用于存放大量小文件。


(11) MongoDB 允许在服务端执行脚本, 可以用 Javascript 编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。

什么是非关系型数据库

非关系型数据库是对不同于传统关系型数据库的统称。非关系型数据库的显著特点是不使用 SQL 作为查询语言,数据存储不需要特定的表格模式。由于简单的设计和非常好的性能所以被用于大数据和 Web Apps 等


面试网站

为什么用 MongoDB?

  • 架构简单

  • 没有复杂的连接

  • 深度查询能力,MongoDB 支持动态查询。

  • 容易调试

  • 容易扩展

  • 不需要转化/映射应用对象到数据库对象

  • 使用内部内存作为存储工作区,以便更快的存取数据。

在哪些场景使用 MongoDB

  • 大数据

  • 内容管理系统

  • 移动端 Apps

  • 数据管理

MySQL 与 MongoDB 之间最基本的差别是什么?

MySQL 和 MongoDB 两者都是免费开源的数据库。MySQL 和 MongoDB 有许多基本差别包括数据的表示(data representation),查询,关系,事务,schema 的设计和定义,标准化(normalization),速度和性能。


通过比较 MySQL 和 MongoDB,实际上我们是在比较关系型和非关系型数据库,即数据存储结构不同。

MongoDB 成为最好 NoSQL 数据库的原因是什么?

以下特点使得 MongoDB 成为最好的 NoSQL 数据库:


  • 面向文件的

  • 高性能

  • 高可用性

  • 易扩展性

  • 丰富的查询语言

journal 回放在条目(entry)不完整时(比如恰巧有一个中途故障了)会遇到问题吗?

每个 journal (group)的写操作都是一致的,除非它是完整的否则在恢复过程中它不会回放。

分析器在 MongoDB 中的作用是什么?

MongoDB 中包括了一个可以显示数据库中每个操作性能特点的数据库分析器。通过这个分析器你可以找到比预期慢的查询(或写操作);利用这一信息,比如,可以确定是否需要添加索引。

名字空间(namespace)是什么?

MongoDB 存储 BSON 对象在丛集(collection)中。数据库名字和丛集名字以句点连结起来叫做名字空间(namespace)。

允许空值 null 吗?

对于对象成员而言,是的。然而用户不能够添加空值(null)到数据库丛集(collection)因为空值不是对象。然而用户能够添加空对象{}。

更新操作立刻 fsync 到磁盘?

不会,磁盘写操作默认是延迟执行的。写操作可能在两三秒(默认在 60 秒内)后到达磁盘。例如,如果一秒内数据库收到一千个对一个对象递增的操作,仅刷新磁盘一次。(注意,尽管 fsync 选项在命令行和经过 getLastError_old 是有效的)

如何执行事务/加锁?

MongoDB 没有使用传统的锁或者复杂的带回滚的事务,因为它设计的宗旨是轻量,快速以及可预计的高性能。可以把它类比成 MySQLMylSAM 的自动提交模式。通过精简对事务的支持,性能得到了提升,特别是在一个可能会穿过多个服务器的系统里。

启用备份故障恢复需要多久?

从备份数据库声明主数据库宕机到选出一个备份数据库作为新的主数据库将花费 10 到 30 秒时间。这期间在主数据库上的操作将会失败--包括


写入和强一致性读取(strong consistent read)操作。然而,你还能在第二数据库上执行最终一致性查询(eventually consistent query)(在 slaveOk 模式下),即使在这段时间里。

什么是 master 或 primary?

它是当前备份集群(replica set)中负责处理所有写入操作的主要节点/成员。在一个备份集群中,当失效备援(failover)事件发生时,一个另外的成员会变成 primary。

什么是 secondary 或 slave?

Seconday 从当前的 primary 上复制相应的操作。它是通过跟踪复制 oplog(local.oplog.rs)做到的。

应该启动一个集群分片(sharded)还是一个非集群分片的 MongoDB 环境?

为开发便捷起见,我们建议以非集群分片(unsharded)方式开始一个 MongoDB 环境,除非一台服务器不足以存放你的初始数据集。从非集群分片升级到集群分片(sharding)是无缝的,所以在你的数据集还不是很大的时候没必要考虑集群分片(sharding)。

分片(sharding)和复制(replication)是怎样工作的?

每一个分片(shard)是一个分区数据的逻辑集合。分片可能由单一服务器或者集群组成,我们推荐为每一个分片(shard)使用集群。

数据在什么时候才会扩展到多个分片(shard)里?

MongoDB 分片是基于区域(range)的。所以一个集合(collection)中的所有的对象都被存放到一个块(chunk)中。只有当存在多余一个块的时后,才会有多个分片获取数据的选项。现在,每个默认块的大小是 64Mb,所以你需要至少 64 Mb 空间才可以实施一个迁移。

如果在一个分片(shard)停止或者很慢的时候,发起一个查询会怎样?

如果一个分片(shard)停止了,除非查询设置了“Partial”选项,否则查询会返回一个错误。如果一个分片(shard)响应很慢,MongoDB 则会等待它的响应。

当更新一个正在被迁移的块(Chunk)上的文档时会发生什么?

更新操作会立即发生在旧的块(Chunk)上,然后更改才会在所有权转移前复制到新的分片上。

MongoDB 在 A:{B,C}上建立索引,查询 A:{B,C}和 A:{C,B}都会使用索引吗?

不会,只会在 A:{B,C}上使用索引。

如果一个分片(Shard)停止或很慢的时候,发起一个查询会怎样?

如果一个分片停止了,除非查询设置了“Partial”选项,否则查询会返回一个错误。如果一个分片响应很慢,MongoDB 会等待它的响应。

MongoDB 支持存储过程吗?如果支持的话,怎么用?

MongoDB 支持存储过程,它是 javascript 写的,保存在 db.system.js 表中。

如何理解 MongoDB 中的 GridFS 机制,MongoDB 为何使用 GridFS 来存储文件?

GridFS 是一种将大型文件存储在 MongoDB 中的文件规范。使用 GridFS 可以将大文件分隔成多个小文档存放,这样我们能够有效的保存大文档,而且解决了 BSON 对象有限制的问题。

mongodb 的数据结构

数据库中存储的对象设计 bson,一种类似 json 的二进制文件,由键值对组成。

MongoDB 的优势有哪些

  • 面向文档的存储:以 JSON 格式的文档保存数据。

  • 任何属性都可以建立索引。

  • 复制以及高可扩展性。

  • 自动分片。

  • 丰富的查询功能。

  • 快速的即时更新。

  • 来自 MongoDB 的专业支持。

什么是集合

集合就是一组 MongoDB 文档。它相当于关系型数据库(RDBMS)中的表这种概念。集合位于单独的一个数据库中。一个集合内的多个文档可以有多个不同的字段。一般来说,集合中的文档都有着相同或相关的目的。

什么是文档

文档由一组 key value 组成。文档是动态模式,这意味着同一集合里的文档不需要有相同的字段和结构。在关系型数据库中 table 中的每一条记录相当于 MongoDB 中的一个文档。

什么是”mongod“

mongod 是处理 MongoDB 系统的主要进程。它处理数据请求,管理数据存储,和执行后台管理操作。当我们运行 mongod 命令意味着正在启动 MongoDB 进程,并且在后台运行。

"mongod"参数有什么

  • 传递数据库存储路径,默认是"/data/db"

  • 端口号 默认是 "27017"

什么是"mongo"

它是一个命令行工具用于连接一个特定的 mongod 实例。当我们没有带参数运行 mongo 命令它将使用默认的端口号和 localhost 连接

MongoDB 哪个命令可以切换数据库

MongoDB 用 use +数据库名称的方式来创建数据库。 use 会创建一个新的数据库,如果该数据库存在,则返回这个数据库。

MongoDB 中的命名空间是什么意思?

MongoDB 内部有预分配空间的机制,每个预分配的文件都用 0 进行填充。


数据文件每新分配一次,它的大小都是上一个数据文件大小的 2 倍,每个数据文件最大 2G。


MongoDB 每个集合和每个索引都对应一个命名空间,这些命名空间的元数据集中在 16M 的*.ns 文件中,平均每个命名占用约 628 字节,也即整个数据库的命名空间的上限约为 24000。


如果每个集合有一个索引(比如默认的_id 索引),那么最多可以创建 12000 个集合。如果索引数更多,则可创建的集合数就更少了。同时,如果集合数太多,一些操作也会变慢。


要建立更多的集合的话,MongoDB 也是支持的,只需要在启动时加上“--nssize”参数,这样对应数据库的命名空间文件就可以变得更大以便保存更多的命名。这个命名空间文件(.ns 文件)最大可以为 2G。


每个命名空间对应的盘区不一定是连续的。与数据文件增长相同,每个命名空间对应的盘区大小都是随分配次数不断增长的。目的是为了平衡命名空间浪费的空间与保持一个命名空间数据的连续性。


需要注意的一个命名空间freelist 是否有大小合适的盘区可以使用,如果有就回收空闲的磁盘空间。

在 MongoDB 中如何创建一个新的数据库

MongoDB 用 use + 数据库名称 的方式来创建数据库。 use 会创建一个新的数据库,如果该数据库存在,则返回这个数据库。

MongoDB 中的分片是什么意思

分片是将数据水平切分到不同的物理节点。当应用数据越来越大的时候,数据量也会越来越大。当数据量增长时,单台机器有可能无法存储数据或可接受的读取写入吞吐量。利用分片技术可以添加更多的机器来应对数据量增加以及读写操作的要求。

什么是复制

复制是将数据同步到多个服务器的过程,通过多个数据副本存储到多个服务器上增加数据可用性。复制可以保障数据的安全性,灾难恢复,无需停机维护(如备份,重建索引,压缩),分布式读取数据。

在 MongoDB 中如何在集合中插入一个文档

要想将数据插入 MongoDB 集合中,需要使用 insert() 或 save() 方法。


>db.collectionName.insert({"key":"value"})>db.collectionName.save({"key":"value"})
复制代码

为什么要在 MongoDB 中使用分析器

数据库分析工具(Database Profiler)会针对正在运行的 mongod 实例收集数据库命令执行的相关信息。包括增删改查的命令以及配置和管理命令。分析器(profiler)会写入所有收集的数据到 system.profile 集合,一个 capped 集合在管理员数据库。分析器默认是关闭的你能通过 per 数据库或 per 实例开启。

MongoDB 支持主键外键关系吗

默认 MongoDB 不支持主键和外键关系。 用 Mongodb 本身的 API 需要硬编码才能实现外键关联,不够直观且难度较大。

MongoDB 支持哪些数据类型

String、Integer、Double、Boolean、Object、Object ID、Arrays、Min/Max Keys、Datetime、Code、Regular Expression 等

86、"ObjectID"由哪些部分组成

一共有四部分组成:时间戳、客户端 ID、客户进程 ID、三个字节的增量计数器


_id 是一个 12 字节长的十六进制数,它保证了每一个文档的唯一性。在插入文档时,需要提供 _id 。如果你不提供,那么 MongoDB 就会为每一文档提供一个唯一的 id。 _id 的头 4 个字节代表的是当前的时间戳,接着的后 3 个字节表示的是机器 id 号,接着的 2 个字节表示 MongoDB 服务器进程 id,最后的 3 个字节代表递增值。

MongoDb 索引

索引用于高效的执行查询。没有索引 MongoDB 将扫描查询整个集合中的所有文档这种扫描效率很低,需要处理大量数据。索引是一种特殊的数据结构,将一小块数据集保存为容易遍历的形式。索引能够存储某种特殊字段或字段集的值,并按照索引指定的方式将字段值进行排序。

如何添加索引

使用 db.collection.createIndex() 在集合中创建一个索引


>db.collectionName.createIndex({columnName:1})
复制代码

在 MongoDB 中如何更新数据

update() 与 save() 方法都能用于更新集合中的文档。 update() 方法更新已有文档中的值,而 save() 方法则是用传入该方法的文档来替换已有文档。

如何删除文档

MongoDB 利用 remove() 方法 清除集合中的文档。它有 2 个可选参数:


  • deletion criteria:(可选)删除文档的标准。

  • justOne:(可选)如果设为 true 或 1,则只删除一个文档。


>db.collectionName.remove({key:value})
复制代码

在 MongoDB 中如何排序

MongoDB 中的文档排序是通过 sort() 方法来实现的。 sort() 方法可以通过一些参数来指定要进行排序的字段,并使用 1 和 -1 来指定排


序方式,其中 1 表示升序,而 -1 表示降序。


面试网站


>db.connectionName.find({key:value}).sort({columnName:1})
复制代码

什么是聚合

聚合操作能够处理数据记录并返回计算结果。聚合操作能将多个文档中的值组合起来,对成组数据执行各种操作,返回单一的结果。它相当于 SQL 中的 count(*) 组合 group by。对于 MongoDB 中的聚合操作,应该使用 aggregate() 方法。


>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
复制代码

在 MongoDB 中什么是副本集

在 MongoDB 中副本集由一组 MongoDB 实例组成,包括一个主节点多个次节点,MongoDB 客户端的所有数据都写入主节点(Primary),副节点从主节点同步写入数据,以保持所有复制集内存储相同的数据,提高数据可用性。




最后给大家分享一个 Github 仓库,上面有大彬整理的 300 多本经典的计算机书籍 PDF,包括 C 语言、C++、Java、Python、前端、数据库、操作系统、计算机网络、数据结构和算法、机器学习、编程人生等,可以 star 一下,下次找书直接在上面搜索,仓库持续更新中~




Github 地址https://github.com/Tyson0314/java-books

用户头像

还未添加个人签名 2023-01-15 加入

非科班转码,拿过几家大厂offer

评论

发布
暂无评论
三天吃透MongoDB面试八股文_Java_程序员大彬_InfoQ写作社区