1. MongoDB成为最好NoSQL数据库的原因?
以下特点使得MongoDB成为最好的NoSQL数据库:面向文件的,高性能,高可用性,易扩展性,丰富的查询语言。
2. MongoDB支持哪些数据类型?
MongoDB数据类型:
objectId:文档自动生成的_id,唯一标识
string:字符串,必须是utf-8
boolean:布尔型,true/false
interger:整数
double:浮点数
arrays:数组或列表
object:字典类型
null:空数据类型
timestamp:时间戳
date:日期
MongoDB中的number:
NumberLong()和NumberLong("")
因为MongoDB中不管是整形,小数,负数等的数值类型就只有NumberLong表示。NumberLong对象里面需要加上双引号才能正常查询。
mongo shell默认将所有数字视为浮点数,但提供了NumberInt()构造函数的来显式指定32位。
NumberInt:32位
NumberLong:64位
3. ObjectId由什么组成?
ObjectId是一个12字节的 BSON 类型字符串。
4字节:UNIX时间戳
3字节:表示运行MongoDB的机器
2字节:表示生成此_id的进程
3字节:由一个随机数开始的计数器生成的值
(1) Time
时间戳。将刚才生成的objectid的前4位进行提取“5e4fa350”,然后按照十六进制转为十进制,变为“1582277456”,这个数字就是一个时间戳。通过时间戳的转换,就成了易看清的时间格式2020-02-21 17:30:56,
(2) Machine
机器。接下来的三个十六进制就是“b636f7”,这三个是所在主机的唯一标识符,一般是机器主机名的散列值,这样就确保了不同主机生成不同的机器hash值,确保在分布式中不造成冲突,这也就是在同一台机器生成的objectId中间的字符串都是一模一样的原因。
(3) PID
进程ID。上面的Machine是为了确保在不同机器产生的objectId不冲突,而pid就是为了在同一台机器不同的MongoDB进程产生了objectId不冲突,接下来的“af71”两位就是产生objectId的进程标识符。
(4) INC
自增计数器。前面的九个字节是保证了一秒内不同机器不同进程生成objectId不冲突,这后面的三个字节“5d6f62”是一个自动增加的计数器,用来确保在同一秒内产生的objectId也不会发现冲突,允许256的3次方等于16777216条记录的唯一性。
总的来看,objectId的前4个十六进制字符是时间戳,记录了文档创建的时间;接下来3个十六进制字符代表了所在主机的唯一标识符,确定了不同主机间产生不同的objectId;后2个是进程id,决定了在同一台机器下,不同MongoDB进程产生不同的objectId;最后通过3个是自增计数器,确保同一秒内产生objectId的唯一性。ObjectId的这个主键生成策略,很好地解决了在分布式环境下高并发情况主键唯一性问题。
4. MongoDB中的索引是什么?
5. MongoDB中的GridFS是什么?
GridFS从名字来看,是一个文件系统,它是MongoDB的一个子模块,使用GridFS可以基于MongoDB来持久存储文件.并且支持分布式应用(文件分布存储和读取). MongoDB中的文档(数据)是以BSON格式存储的,由于BSON的限制只能存储16M一下的数据;为了应对这个问题MongoDB提供了GridFS子模块,他可以存储大于16M的文件。GridFS是一种将大型文件存储在MongoDB的文件规范。所有官方支持的驱动均实现了GridFS规范。 实际上小于16M的可以直接用mongo的bson存就好了,大于16M的才需要借助Gridfs。
GridFS使用两个集合来存储文件:fs.files与fs.chunks。其中fs.files集合存放文件的信息,fs.chunks存放文件的数据。GridFS会将大文件对象分割成多个小的chunk(文件片段),一般为256k/个,每个chunk作为MongoDB的一个文档存储在chunks集合中。
使用场景:
1) 有大量的上传图片(用户上传或者系统本身的文件发布等)
2) 文件的量级处于飞速增长,有可能打到单机操作系统自己的文件系统的查询性能瓶颈,甚至超过单机硬盘的扩容范围.
3) 文件的备份(不适用gridfs这种三方也可以做,但是不尽方便),文件系统访问的故障转移和修复..
4) 文件的索引,存储除文件本身以外还需要关联更多的元数据信息(比如,不仅仅存储文件,还要保存一些文件的发布式作者/发布时间/文件tag属性等等自定义信息)并且需要索引的...
5) 基于4),对文件的分类模糊,如果采用操作系统的文件系统,文件夹分类关系混乱或者无法分类时..
6) 当前系统是基于web的,对图片的访问根据url了规则路由的..(普通文件系统也可以)
7) 文件尺寸较小,而且众多,且文件有可能被迁移/删除等..
./mongofiles --uri='MongoDB://mongouser:qidian%40weixin@11.186.6.xxx:27017' --db db_shuozhuo put service.yaml
./mongofiles --host 11.186.6.xxx:27017 -u mongouser -p wexin@mongo -d db_shuozhuo put build_vs_env.sh
6. 什么是MongoDB中的"命名空间"?
MongoDB存储bson对象在丛集(collection)中,数据库名字和丛集名字以句点连结起来叫做命名空间,一个集合命名空间又有多个数据域(extent),集合命名空间里存储着集合的元数据,比如集合名称,集合的第一个数据域和最后一个数据域的位置等等。而一个数据域由若干条文档(document)组成,每个数据域都有一个头部,记录着第一条文档和最后一条文档的为知,以及该数据域的一些元数据。extent之间,document之间通过双向链表连接,索引的存储数据结构是B树,索引命名空间存储着对B树的根节点的指针。
7. MongoDB中的分片是什么?
1.分片简介
分片是指将数据拆分,将其分散存在不同机器上的过程.有时也叫分区.将数据分散在不同的机器上,不需要功能强大的大型计算机就可以存储更多的数据,处理更大的负载。使用几乎所有数据库软件都能进行手动分片,应用需要维护与若干不同数据库服务器的连接,每个连接还是完全独立的。应用程序管理不同服务器上的不同数据,存储查村都需要在正确的服务器上进行.这种方法可以很好的工作,但是也难以维护,比如向集群添加节点或从集群删除节点都很困难,调整数据分布和负载模式也不轻松。MongoDB支持自动分片,可以摆脱手动分片的管理.集群自动切分数据,做负载均衡.
2.MongoDB的自动分片
MongoDB分片的基本思想就是将集合切分成小块.这些块分散到若干片里面,每个片只负责总数据的一部分.应用程序不必知道哪片对应哪些数据,甚至不需要知道数据已经被拆分了,所以在分片之前要运行一个路由进程,进程名mongos,这个路由器知道所有数据的存放位置,所以应用可以连接它来正常发送请求.对应用来说,它仅知道连接了一个普通的mongod.路由器知道和片的对应关系,能够转发请求到正确的片上.如果请求有了回应,路由器将其收集起来回送给应用.在没有分片的时候,客户端连接mongod进程,分片时客户端会连接mongos进程.mongos对应用隐藏了分片的细节.
详见: https://www.qy.cn/jszx/detail/2010.html
8. 什么是MongoDB的副本集?
副本集是一组维护相同数据的Mongod服务。副本集由多个服务组成,包含一个主服务器/主节点(primary)负责处理客户端请求,以及若干个副服务器/备份节点(secondary)负责保存主服务器的数据副本。如果主服务器崩溃了,副本集通过其主节点选举机制,可以自动将某个备份节点升级成为主节点。
这样,就可以避免因主节点服务器不可访问而影响用户使用。(这种机制被称为为自动故障转移)。
9. MongoDB的优势有哪些?
性能优越:在使用场合下,千万级别的文档对象,近10G的数据,对有索引的ID的查询不会比mysql慢,而对非索引字段的查询,则是全
面胜出。 mysql实际无法胜任大数据量下任意字段的查询,而mongodb的查询性能实在让我惊讶。写入性能同样很令人满意,同样写入
百万级别的数 据,mongodb比我以前试用过的couchdb要快得多,基本10分钟以下可以解决。补上一句,观察过程中mongodb都远算不上是CPU杀手。
a.面向集合的存储:适合存储对象及JSON形式的数据。
b.动态查询:mongo支持丰富的查询表达方式,查询指令使用JSON形式的标记,可轻易查询文档中的内嵌的对象及数组。
c.完整的索引支持:包括文档内嵌对象及数组。mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。
d.查询监视:mongo包含一个监视工具用于分析数据库操作性能。
e.复制及自动故障转移:mongo数据库支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目的是提供冗余及自动故障转移。
f.高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)。
g.自动分片以支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器。
10. MongoDB的使用场景?
mongodb的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统(丰富的功能)架起一座桥梁,集两者的优势于一身。mongo适用于以下场景:
a.网站数据: mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
b.缓存:由于性能很高,mongo也适合作为信息基础设施的缓存层。在系统重启之后,由mongo搭建的持久化缓存可以避免下层的数据源过载。
c.大尺寸、低价值的数据:使用传统的关系数据库存储一些数据时可能会比较贵,在此之前,很多程序员往往会选择传统的文件进行存储。
d.高伸缩性的场景:mongo非常适合由数十或者数百台服务器组成的数据库。
e.用于对象及JSON数据的存储:mongo的BSON数据格式非常适合文档格式化的存储及查询。
使用行业:
游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新
物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。
社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能
物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析
视频直播,使用 MongoDB 存储用户信息、礼物信息等
11. 为什么要在MongoDB中使用分析器?
MongoDB中包括了一个可以显示数据库中每个操作性能特点的数据库分析器。
通过这个分析器你可以找到比预期慢的查询(或写操作)
12. MongoDB支持主键外键关系吗?
默认MongoDB不支持主键和外键关系。 用Mongodb本身的API需要硬编码才能实现外键关联,不够直观且难度较大
13. 为什么要在MongoDB中使用"Code"数据类型?
"Code"类型用于在文档中存储 JavaScript 代码。
14. MongoDB如何添加索引?
使用db.collection.createIndex()在集合中创建一个索引
15. MongoDB如何排序?
db.connectionName.find({key:value}).sort({columnName:1})
16. 什么是聚合?
17. MongoDB支持存储过程吗?若支持,怎么使用?
MongoDB支持存储过程,它是javascript写的,保存在db.system.js表中。
18. 如何理解MongoDB中的GridFS机制,MongoDB为何试用GridFS来存储文件?
19. 为什么MongoDB的数据文件很大?
20. 当更新一个正在被迁移的块(Chunk)上的文档会发生什么?
更新操作会立即发生在旧的块(Chunk)上,然后更改才会在所有权转移前复制到新的分片上。
21. MongoDB是否支持事务?
22. MongoDB数据在什么时候才会扩展到多个分片(shard)中?
23. MongoDB启用备份故障恢复需要多久?
24. MongoDB如何执行事务/加锁?
25. MongoDB允许空值null吗?
26. MongoDB会实时同步刷新数据到磁盘吗?
不会,磁盘写操作默认是延迟执行的.写操作可能在两三秒(默认在60秒内)后到达磁盘.例如,如果一秒内数据库收到一千个对一个对象递增的操作,仅刷新磁盘一次.
27. MongoDB使用索引需要注意什么?
28.
29.
30.