关注公众号【Ccww笔记】,获取干货资料
java
MongoDB
是基于分布式文件存储的数据库,由C++
语言编写。旨在为WEB
应用提供可扩展的高性能数据存储解决方案,且MongodDB
是一个介于关系数据库与非关系数据库之间的产品,是非关系型数据库中功能最丰富,最像关系数据库。mysql
因为MongoDB
的特性以及功能,使得其在企业使用频率很大,因此不少面试都会MongoDB的相关知识,基于网上以及本身阅读官网文档总结2019-2020年MongoDB
的面试题。具体以下:linux
MongoDB
的优点有哪些?面向集合(Collection
)和文档(document
)的存储,以JSON格式的文档保存数据。面试
高性能,支持Document
中嵌入Document
减小了数据库系统上的I/O操做以及具备完整的索引支持,支持快速查询正则表达式
高效的传统存储方式:支持二进制数据及大型对象redis
高可用性,数据复制集,MongoDB 数据库支持服务器之间的数据复制来提供自动故障转移(automatic failover
)算法
高可扩展性,分片(sharding
)将数据分布在多个数据中心,MongoDB支持基于分片键建立数据区域.sql
丰富的查询功能, 聚合管道(Aggregation Pipeline
)、全文搜索(Text Search
)以及地理空间查询(Geospatial Queries
)mongodb
支持多个存储引擎,WiredTiger存储引、In-Memory存储引擎数据库
MongoDB
支持哪些数据类型?java相似数据类型:
类型 | 解析 |
---|---|
String |
字符串。存储数据经常使用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的 |
Integer |
整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位 |
Double |
双精度浮点值。用于存储浮点值 |
Boolean |
布尔值。用于存储布尔值(真/假) |
Arrays |
用于将数组或列表或多个值存储为一个键 |
Datetime |
记录文档修改或添加的具体时间 |
MongoDB特有数据类型:
类型 | 解析 |
---|---|
ObjectId |
用于存储文档 id ,ObjectId 是基于分布式主键的实现MongoDB 分片也可继续使用 |
Min/Max Keys |
将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比 |
Code |
用于在文档中存储 JavaScript 代码 |
Regular Expression |
用于在文档中存储正则表达式 |
Binary Data |
二进制数据。用于存储二进制数据 |
Null |
用于建立空值 |
Object |
用于内嵌文档 |
Collection
、文档Document
,以及与关系型数据库术语类比。Collection
位于单独的一个数据库MongoDB 文档Document
集合,它相似关系型数据库(RDBMS)中的表Table
。一个集合Collection
内的多个文档Document
能够有多个不一样的字段。一般状况下,集合Collection
中的文档Document
有着相同含义。Document
由key-value构成。文档Document
是动态模式,这说明同一集合里的文档不须要有相同的字段和结构。相似于关系型数据库中table中的每一条记录。mongodb | 关系型数据库 |
---|---|
Database | Database |
Collection | Table |
Document | Record/Row |
Filed | Column |
Embedded Documents | Table join |
Mongod
“,以及MongoDB
命令。 mongod
是处理MongoDB
系统的主要进程。它处理数据请求,管理数据存储,和执行后台管理操做。当咱们运行mongod
命令意味着正在启动MongoDB
进程,而且在后台运行。
MongoDB
命令:
命令 | 说明 |
---|---|
use database_name | 切换数据库 |
db.myCollection.find().pretty() | 格式化打印结果 |
db.getCollection(collectionName).find() | 修改Collection名称 |
Mongod
"默认参数有?"/data/db"
MySQL
和mongodb
的区别形式 | MongoDB | MySQL |
---|---|---|
数据库模型 | 非关系型 | 关系型 |
存储方式 | 虚拟内存+持久化 | |
查询语句 | 独特的MongoDB查询方式 | 传统SQL语句 |
架构特色 | 副本集以及分片 | 常见单点、M-S、MHA、MMM等架构方式 |
数据处理方式 | 基于内存,将热数据存在物理内存中,从而达到高速读写 | 不一样的引擎拥有本身的特色 |
使用场景 | 事件的记录,内容管理或者博客平台等数据大且非结构化数据的场景 | 适用于数据量少且不少结构化数据 |
mongodb
和redis
区别以及选择缘由形式 | MongoDB | redis |
---|---|---|
内存管理机制 | MongoDB 数据存在内存,由 linux系统 mmap 实现,当内存不够时,只将热点数据放入内存,其余数据存在磁盘 | Redis 数据所有存在内存,按期写入磁盘,当内存不够时,能够选择指定的 LRU 算法删除数据 |
支持的数据结构 | MongoDB 数据结构比较单一,可是支持丰富的数据表达,索引 | Redis 支持的数据结构丰富,包括hash、set、list等 |
性能 | mongodb依赖内存,TPS较高 | Redis依赖内存,TPS很是高。性能上Redis优于MongoDB |
可靠性 | 支持持久化以及复制集增长可靠性 | Redis依赖快照进行持久化;AOF加强可靠性;加强可靠性的同时,影响访问性能 |
数据分析 | mongodb内置数据分析功能(mapreduce) | Redis不支持 |
事务支持状况 | 只支持单文档事务,须要复琐事务支持的场景暂时不适合 | Redis 事务支持比较弱,只能保证事务中的每一个操做连续执行 |
集群 | MongoDB 集群技术比较成熟 | Redis从3.0开始支持集群 |
选择缘由:
架构简单
没有复杂的链接
深度查询能力,MongoDB
支持动态查询。
容易调试
容易扩展
不须要转化/映射应用对象到数据库对象
使用内部内存做为存储工做区,以便更快的存取数据。
mongodb
没有使用传统的锁或者复杂的带回滚的事务,由于它设计的宗旨是轻量,快速以及可预计的高性能.能够把它类比成mysql mylsam
的自动提交模式.经过精简对事务的支持,性能获得了提高,特别是在一个可能会穿过多个服务器的系统里.
不会,磁盘写操做默认是延迟执行的.写操做可能在两三秒(默认在60秒内)后到达磁盘,经过 syncPeriodSecs
启动参数,能够进行配置.例如,若是一秒内数据库收到一千个对一个对象递增的操做,仅刷新磁盘一次.
10Q: 索引类型有哪些?
Single Field Indexes
)Compound Indexes
)Multikey Indexes
)text Indexes
)Hash Indexes
)Wildcard Index
)2dsphere Indexes
)11Q:MongoDB
在A:{B,C}上创建索引,查询A:{B,C}和A:{C,B}都会使用索引吗?
因为MongoDB
索引使用B-tree
树原理,只会在A:{B,C}上使用索引
MongoDB
索引详情可看文章【MongoDB
系列--轻松应对面试中遇到的MongonDB索引(index)问题】,其中包括不少索引的问题:
聚合操做可以处理数据记录并返回计算结果。聚合操做能将多个文档中的值组合起来,对成组数据执行各类操做,返回单一的结果。它至关于 SQ
L 中的 count(*)
组合 group by
。对于 MongoDB
中的聚合操做,应该使用aggregate()
方法。
详情可查看文章【MongoDB系列--深刻理解MongoDB聚合(Aggregation)】,其中包括不少聚合的问题:
aggregation pipeline
)的问题Aggregation Pipeline
优化等问题13Q:monogodb
中的分片sharding
分片sharding
是将数据水平切分到不一样的物理节点。当应用数据愈来愈大的时候,数据量也会愈来愈大。当数据量增加 时,单台机器有可能没法存储数据或可接受的读取写入吞吐量。利用分片技术能够添加更多的机器来应对数据量增长 以及读写操做的要求。
14Q:分片(Shard
)和复制(replication
)是怎样工做的?
每个分片(shard
)是一个分区数据的逻辑集合。分片可能由单一服务器或者集群组成,咱们推荐为每个分片(shard
)使用集群。
15Q:若是块移动操做(moveChunk
)失败了,我须要手动清除部分转移的文档吗?
不须要,移动操做是一致(consistent
)而且是肯定性的(deterministic
)。
16Q:数据在何时才会扩展到多个分片(Shard
)里?
MongoDB
分片是基于区域(range
)的。因此一个集合(collection
)中的全部的对象都被存放到一个块(chunk
)中,默认块的大小是 64Mb。当数据容量超过64 Mb,才有可能实施一个迁移,只有当存在不止一个块的时候,才会有多个分片获取数据的选项。
17Q:更新一个正在被迁移的块(Chunk)上的文档时会发生什么?
更新操做会当即发生在旧的块(Chunk)上,而后更改才会在全部权转移前复制到新的分片上。
18Q:若是一个分片(Shard)中止或很慢的时候,发起一个查询会怎样?
若是一个分片中止了,除非查询设置了 “Partial
” 选项,不然查询会返回一个错误。若是一个分片响应很慢,MongoDB
会等待它的响应。
19Q:MongoDB
副本集实现高可用的原理
MongoDB
使用了其复制(Replica Set
)方案,实现自动容错机制为高可用提供了基础。目前,MongoDB
支持两种复制模式:
Master
/ Slave
,主从复制,角色包括 Master
和 Slave
。Replica Set
,复制集复制,角色包括 Primary
和 Secondary
以及 Arbiter
。(生产环境必选)20Q:什么是master
或primary
?
副本集只能有一个主节点可以确认写入操做来接收全部写操做,并记录其操做日志中的数据集的全部更改(记录在oplog中)。在集群中,当主节点(master
)失效,Secondary节点会变为master
21Q:什么是Slave
或Secondary
?
复制主节点的oplog并将oplog记录的操做应用于其数据集,若是主节点宕机了,将从符合条件的从节点选举选出新的主节点。
22Q:什么是Arbiter
?
仲裁节点不维护数据集。 仲裁节点的目的是经过响应其余副本集节点的心跳和选举请求来维护副本集中的仲裁
23Q:复制集节点类型有哪些?
Priority 0
)节点Hidden
)节点Delayed
)节点Vote
)节点以及不可投票节点24Q:启用备份故障恢复须要多久?
从备份数据库声明主数据库宕机到选出一个备份数据库做为新的主数据库将花费10到30秒时间.这期间在主数据库上的操做将会失败–包括写入和强一致性读取(strong consistent read
)操做.然而,你还能在第二数据库上执行最终一致性查询(eventually consistent query
)(在slaveok
模式下),即便在这段时间里.
MongoDB
复制详解分析可查看文章【MongoDB系列-解决面试中可能遇到的MongoDB复制集(replica set)问题】
raft
选举过程,投票规则?选举过程:
当系统启动好以后,初始选举后系统由1个Leader
和若干个Follower
角色组成。而后忽然因为某个异常缘由,Leader
服务出现了异常,致使Follower
角色检测到和Leader
的上次RPC更新时间超过给定阈值时间时。此时Followe
r会认为Leader
服务已出现异常,而后它将会发起一次新的Leader
选举行为,同时将自身的状态从Follower
切换为Candidate
身份。随后请求其它Follower
投票选择本身。
投票规则:
可查看文章【通俗易懂的Paxos算法-基于消息传递的一致性算法】
MongoDB
?规则: 若是业务中存在大量复杂的事务逻辑操做,则不要用MongoDB
数据库;在处理非结构化 / 半结构化的大数据使用MongoDB
,操做的数据类型为动态时也使用MongoDB
,好比:
Apps
:O2O
送快递骑手、快递商家的信息(包含位置信息)最后可关注公众号【Ccww笔记】,一块儿学习,天天会分享干货,还有学习视频干货领取!