一、什么是MongoDB
面向文档的数据库

一 . 优点

  1. 使用 (文档取代行,一条记录表达复杂层级关系;去K-V化,字段的添加删除更加方便)
  2. 扩展 (易于拓展,自动处理跨集群数据和负载,集群加入硬盘,横向拓展自动数据传输)
    内置分片对范围自动分片机制:
    一个collection可按照记录的范围,分成若干个段,切分到不同的Shard上。
    Shards可以和复制结合,配合Replica sets能够实现Sharding+fail-over,不同的Shard之间可以负载均衡
    查询是对 客户端是透明的。客户端执行查询,统计,MapReduce等操作,这些会被MongoDB自动路由到后端的数据节点。这让我们关注于自己的业务,适当的 时候可以无痛的升级。MongoDB的Sharding设计能力最大可支持约20 petabytes,足以支撑一般应用。
    这可以保证MongoDB运行在便宜的PC服务器集群上。PC集群扩充起来非常方便并且成本很低,避免了“sharding”操作的复杂性和成本
  3. 功能模块丰富
    3.1 索引 二级索引,多种快速查询 唯一索引 / 复合索引 / 地理空间索引 / 全文索引
    3.2 聚合 支持聚合管道,自动优化。(过滤,重新组合输出,指定字段分组,排序(操作符表达代替MapReduce))
    3.3 特殊的集合类型 例如(场景1 :定时过期会话; 场景2: 固定大小集合日志)
    3.4 文件存储
  4. 性能好
    4.1 BJSON 二进制存储,存入性能快。内存用作缓存,为查询分配索引
    4.2 内置GridFS(布式文件系统),支持大容量的存储,能够满足对大数据集的快速范围查询
    4.3 对于非索引字段查询在千万级别会非常快
    二. 缺点
  5. 不支持事务,join,空间占用大 申请机制(64,128,256 逐次递增,直到单个2G)
  6. 删除记录不释放空间,只标志删除

二、MongoDB 拓展机制
图片1.png

三、文档、集合、数据库

文档(一行数据)即:对象
键值对的有续集{“name” : “张三”,“age” : “24”}
键值不能包含 (\0 , . , $),不区分大小写

集合(动态表)
命名:禁止’’,\0,system开头,$, .

数据库(集合的组合)
命名:禁止 / , \ ,’ ’, . , < , > , * , : , ? , | , \0 .
只能使用 ASCII 中字母和数字
只能小写,最长64位
数据库: local,config,admin 这些数据库是保留的

四、数据类型
1、null。{"x":null}。
2、Boolean。{"x":true} 、{“x":false}。
3、数据类型。在Mongodb Shell中默认使用64位浮点型数据,如{“x":2.32}、{"x":2},如果要使用整数类型则用{"x":NumberInt(2)}、{"x":NumberLong(2)}。
4、字符串。Mongodb中字符串采用UTF-8编码方式,{"x":"hello world"}。
5、日期类型。{"x":new Date()}。 自新纪元以来经过的毫秒数,不存储时区
6、正则表达式。{"x":/itbilu/i}。
7、数据。{"x":["hello","world"]}。
8、内嵌文档。{"x":{"y":"Hello"}}。
9、Id和ObjectId()。ID为一个12字节24个16进制数字组成.
10、代码。{"x":function aa(){}}。 查询文档中可包含任意代码.
11、二进制。任意字节的字串,保存UTF8唯一方式
12、数组。{“brave” : [“pie”,3.14]} 可以包含不同类型元素,Mongodb能自动理解其结构,并操作内容

五、object _ID 生成的原理

机器如何保证ObjectId生成唯一

原理: 12字节 24位16进制数字组成
0|1|2|3|4|5|6|7|8|9|10|11
时间戳|机 器 |PID |计数器

模块一(前4): 从纪元开始时间戳,单位秒
模块二(5-7):机器名HASH
模块三(8/9):多线程ID号
模块四(后3):计数器

阀值: 256三次方ID/S