0
点赞
收藏
分享

微信扫一扫

Mongodb秘籍

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.

举报

相关推荐

0 条评论