乐趣区

关于java:三天吃透MongoDB面试八股文

本文曾经收录到 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,这个命名空间用于记录不再应用的盘区(被删除的 Collection 或索引)。每当命名空间须要调配新盘区时,会先查看 $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

退出移动版