当前位置: 首页 > news >正文

MongoDB面试题整理-四年经验

介绍

MongoDB是一个文档数据库,提供好的性能,领先的非关系型数据库。采用BSON存储文档数据。
BSON()是一种类json的一种二进制形式的存储格式,简称Binary JSON.
相对于json多了date类型和二进制数组。

一、MongoDB的优势有哪些

  • 面向文档的存储:以 JSON 格式的文档保存数据。
  • 任何属性都可以建立索引。
  • 复制以及高可扩展性。
  • 自动分片。
  • 丰富的查询功能。
  • 快速的即时更新。

二、使用MongoDB的场景

  • 大数据
  • 内容管理系统
  • 移动端Apps
  • 数据管理

三、MongoDB的命名空间

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

  • 一个集合命名空间又有多个数据域(extent),集合命名空间里存储着集合的元数据,比如集合名称,集合的第一个数据域和最后一个数据域的位置等等。而一个数据域由若干条文档(document)组成,每个数据域都有一个头部,记录着第一条文档和最后一条文档的为知,以及该数据域的一些元数据。

  • extent之间,document之间通过双向链表连接。 索引的存储数据结构是B树,索引命名空间存储着对B树的根节点的指针。

四、MongoDB的数据类型

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

Code是用来存储代码的。

正则表达式则是在文档中存储正则。

五、ObjectID有哪几部分组成

时间戳、客户端ID、客户进程ID、三个字节的增量计数器

  • 前4个字节表示时间戳;
  • 接下来的3个字节是机器标识码;
  • 紧接的两个字节由进程id组成(PID);
  • 最后三个字节是自增计数器生成的随机数;

六、副本集与主从同步

1. 选举

  1. 如果主挂了,mongodb保证只有操作序列为最大的从才能成为新的主,这只保证了数据尽可能地少丢,如果写操作是写1个节点以上成功才认为成功,可保证不丢数据

  2. 如果新的主丢了老的主的部分操作,而且老的主又重新加入副本集,这时老的主会回滚操作以保证与新的主状态一致。回滚日志会被记录到文件里,通过工具可手动将回滚操作来新的主上执行,以恢复数据。另外,如果需要的回滚数据超过300M,老的主不会进行回滚,并log异常;如果要强制回滚到300M之前,可采用重新同步数据的方法来保证与新主状态一致,但不能恢复这300M数据了。

  3. mongodb可保证优先级最高的从节点变为主;

  4. 优先级为0的从节点不进行选主,即不能成为主;

  5. 除了主从节点,还有仲裁者节点,不保存副本数据,只用于选主投

2.变更主从

副本集支持手动变更主从关系吗?支持的话,变更会不会出现数据丢失呢?可对比下redis cluster

(1)You can force a replica set member to become primary by giving it a higher priority value than any other member in the set.(所以是支持的)

(2)变更不会出现数据丢失,因为mongodb会停止原主的更新操作,直到新主追上最新的plog后并成功变为主,才恢复更新操作(跟redis cluster的no force变更策略一样)。

副本集一般是三个数据库。

相关文章:

  • 机器学习笔记之深度玻尔兹曼机(一)玻尔兹曼机系列整体介绍
  • 【Linux】探索缓冲区的概念 | Git 三板斧 | 实现简易进度条
  • JS语言基础
  • 详解分布式系统核心概念——CAP、CP和AP
  • 【JavaEE初阶】第二节.进程篇
  • dockerfile笔记
  • 解决: 您目前无法访问 因为此网站使用了 HSTS。网络错误和攻击通常是暂时的,因此,此网页稍后可能会恢复正常
  • 【程序员陪你过大年】html+css+js 实现春节动态烟花特效及服务器部署
  • 后台生成4位图像验证码
  • 移动端App自动化之触屏操作自动化
  • requests页面常用操作(post、put、get、head、patch、delete方法)
  • 力扣sql基础篇(九)
  • 目标跟踪心得篇四:多目标跟踪的测评(性能指标)详解
  • 实现通讯录(C语言)
  • Linux - Buildroot简介和生成工具链SDK
  • Python库functools详解
  • MyBatis中TypeHandler的使用教程
  • Cookie和Session以及相关的方法
  • 【C语言】柔性的数组是什么?C/C++程序的内存开辟又是?
  • 从0到1完成一个Node后端(express)项目(四、路由、模块化、中间件、跨域)