一.简介
MongoDB一种非关系型数据库(NoSql),是一种强大、灵活、可扩展的数据存储方式,因为MongoDB是文档模型,自由灵活很高,可以让你在开发过程中畅顺无比,对于大数据量、高并发、弱事务的互联网应用,MongoDB可以应对自如,MongoDB内置的水平扩展机制提供了从百万到十亿级别的数据量处理能力,还对MapReduce式聚合的支持,以及对地理空间索引的支持。
1.1、为什么需要NoSQL
简单的说,就是为了解决在web2.0时代,出现的三高要求:
1:对数据库高并发读写的需求
2:对海量数据的高效率存储和访问的需求
3:对数据库的高可扩展性和高可用性的需求
而RDB(关系型数据库)里面的一些特性,在web2.0里面往往变得不那么重要,比如:
1:数据库事务一致性
2:数据库的实时读写
3:复杂的SQL查询,特别是多表关联查询
1.2、CAP定理
CAP定理, 又被称作布鲁尔定理(Eric Brewer)它指出对于一个分布式计算系统来说,不可能同时满足以下三点:
1:强一致性(Consistency):系统在执行过某项操作后仍然处于一致的,在分布式系统中,更新操作执行成功后所有的用户都应该读取到最新的值,这样的系统被认为具有强一致性
2:可用性(Availability):每一个操作总是能够在一定的时间内返回结果
3:分区容错性(Partition tolerance):系统在存在网络分区的情况下仍然可以接受请求并处理,这里网络分区是指由于某种原因网络被分成若干个孤立区域,而区域之间互不相通
根据CAP原理将数据库分成了满足CA原则、满足CP原则和满足AP原则三大类:
1:CA:单点集群,满足一致性,可用性,通常在可扩展性上不太强大,比如RDB
2:CP:满足一致性和分区容错性,通常性能不是特别高,如分布式数据库
3:AP:满足可用性和分区容错性,通常可能对一致性要求低一些,如大多数的NoSQL
BASE原理(Basically Available,Soft-state,Eventual consistency )
1:基本可用(Basically Available):系统能够基本运行、一直提供服务。
2:软状态(Soft-state):系统不要求一直保持强一致状态。
3:最终一致性(Eventual consistency):系统需要在某一时刻后达到一致性要求
1.3、NoSQL的优缺点
优点
1、扩展简单方便,尤其是水平横向扩展
(纵向扩展是指用更强的机器;横向扩展是指把数据分散到多个机器)
2、读写快速高效,多数都会映射到内存操作
3、成本低廉,用普通机器,分布式集群即可
4、数据模型灵活,没有固定的数据模型
NoSQL的缺点
不提供对SQL的支持
现有产品还不够成熟稳定,功能也还有待加强
1.4、mongodb的特点
高性能、易于使用、易于扩展、功能丰富
面向集合存储,模式自由
支持动态查询,支持javascript表达式查询
支持完全索引,包含内部对象
支持复制和故障恢复
支持副本集复制和自动故障恢复
自动处理分片
使用高效的二进制数据储存,包括大型对象
文件存储格式为BSON(一种JSON的扩展)
二.基本概念
数据库
MongoDB的一个实例可以拥有一个或多个相互独立的数据库,每个数据库都有自己的集合
文档(document):是MongoDB中数据的基本单元
非常类似于关系型数据库系统中的行(但是比行要复杂的多)
注意:
每一个文档都有一个特殊的键”_id”,它在文档所处的集合中是唯一的,相当于关
系数据库中的表的主键
集合(collection):就是一组文档
类似于关系型数据库系统中的表
_id
每个文档都有个特殊的“_id”,在文档所属集合中是唯一的
JavaScript shell
MongoDB自带了一个功能强大的JavaScript Shell,可以用于管理或操作MongoDB
MongoDB的单个计算机可以容纳多个独立的数据库,每一个数据库都有自己的集合和权限。
MongoDB自带简介但功能强大的JavaScript shell,这个工具对于管理MongoDB实例和操作数据作用非常大
注意:MongoDB中没有主外键的概念
三.规则与数据类型
3.1、数据库名称定义规则
1、不能是空串
2、不得含有/、\、?、$、空格、空字符等等,基本只能使用ASCII中的字母和数字
3、区分大小写,建议全部小写
4、最多为64字节
5、不得使用保留的数据库名,比如:admin,local,config
注意:数据库最终会成为文件,数据库名就是文件的名称
3.2、集合名称定义规则
1、不能是空串
2、不能包含\0字符(空字符),这个字符表示集合名的结束,也不能包含”$”
3、不能以”system.”开头,这是为系统集合保留的前缀
3.3、文档的键的定义规则
1、不能包含\0字符(空字符),这个字符表示键的结束
2、“.”和“$”是被保留的,只能在特定环境下用
3、区分类型,同时也区分大小写
4、键不能重复
注意:文档的键值对是有顺序的,相同的键值对如果有不同顺序的话,也是不同的文档
3.4、数据类型
数据类型 描述 举例
null 表示空值或者未定义的对象 {"x":null}
布尔值 真或者假:true或者false {"x":true}
32位整数 shell不支持该类型,默认会转换成64位浮点数,也可以使用NumberInt类,比如: {“x”:NumberInt(“3”)}
64位整数 shell不支持该类型,默认会转换成64位浮点数,也可以使用NumberLong类,比如: {“x”:NumberLong(“3”)}
64位浮点数 shell中的数字就是这一种类型 {"x":3.14,"y":3}
字符串 UTF-8字符串 {"foo":"bar"}
符号 shell不支持,shell会将数据库中的符号类型的数据自动转换成字符串
对象id 文档的12字节的唯一id {"id": ObjectId()}
日期 从标准纪元开始的毫秒数 {"date":new Date()}
正则表达式 文档中可以包含正则表达式,遵循JavaScript的语法 {"foo":/foobar/i}
代码 文档中可以包含JavaScript代码 {"x":function() {}}
未定义 undefined {"x":undefined}
数组 值的集合或者列表 {"arr": ["a","b"]}
内嵌文档 文档可以作为文档中某个key的value {"x":{"foo":"bar"}}
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。