一、简介
MongoDB是一款强大、灵活、且易于扩展的通用型数据库
1、易用性
1)MongoDB是一款面向文档的数据库,而不是关系型数据库,因此而有着更好的扩展性。
2)通过在文档中嵌入文档和数组,面向文档的方法能够仅使用一条记录来表现复杂的层级关系。
3)MongoDB没有预定义模式(predefined schema):文档的键和值不再有固定的类型和大小;这样没有固定的模式,添加或删除字段就变得容易了。
4)使用MongoDB开发时能够进行快速迭代,所以开发进程得以加快。
2、易扩展性
PS:当数据量不断增长,增长到存储极限时,就需要扩展数据库了;数据库的扩展分为纵向扩展和横向扩展:纵向扩展就是使用性能更好的机器,
横向扩展就是使用更多的机器。
1)MongoDB的设计采用横向扩展,它能很容易的在多台服务器之间进行数据分割
2)MongoDB能够自动处理跨集群的数据和负载,自动重新分配文档,并将用户的请求路由到正确的机器上。
3、丰富的功能
1)索引
- 支持通用二级索引,允许多种快速查询,且提供唯一索引、复合索引、地理空间索引、全文索引
2)存储JavaScript
- 开发人员可以直接在服务端存取JavaScript的函数和值
3)聚合
- 支持聚合管道,用户能通过简单的片段创建复杂的集合,并通过数据库自动优化
4)特殊的集合类型
- 支持存在时间有限的集合,适用于那些将在某个时刻过期的数据,如会话session。类似地,MongoDB也支持固定大小的集合,用于保存近期数据,如日志。
5)文件存储
- 支持一种非常易用的协议,用于存储大文件和文件元数据。MongoDB并不具备一些在关系型数据库中很普遍的功能,如链接join和复杂的多行事务。省略
这些的功能是处于架构上的考虑,或者说为了得到更好的扩展性,因为在分布式系统中这两个功能难以高效地实现。
4、卓越的性能
1)MongoDB把尽可能多的内存用作缓存cache,视图为每次查询自动选择正确的索引。
2)只要有可能,数据库服务器就会将处理逻辑交给客户端。这种精简方式的设计是MongoDB能够实现如此高性能的原因之一。
二、MongoDB基础知识
1、文档是MongoDB的核心概念。文档就是键值对的一个有序集{'msg':'hello','foo':3}。类似于python中的有序字典。
需要注意的是: #1、文档中的键/值对是有序的。 #2、文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。 #3、MongoDB区分类型和大小写。 #4、MongoDB的文档不能有重复的键。 #5、文档中的值可以是多种不同的数据类型,也可以是一个完整的内嵌文档。文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。 文档键命名规范: #1、键不能含有\0 (空字符)。这个字符用来表示键的结尾。 #2、.和$有特别的意义,只有在特定环境下才能使用。 #3、以下划线"_"开头的键是保留的(不是严格要求的)。
2、集合就是一组文档。如果将MongoDB中的一个文档比喻为关系型数据的一行,那么一个集合就是相当于一张表
1)集合存在于数据库中,为了管理方便,我们应该将不同格式和类型的数据插到不同的集合,但集合并没有固定的结构,
也就意味着我们完全可以把不同格式和类型的数据插入到同一个集合中。
2)使用“.”组织子集合
比如一个具有博客功能的应用可能包含两个集合,分别是blog.posts和blog.authors,这是为了使组织结构更清晰,
这里的blog集合(这个集合甚至不需要存在)跟它的两个子集合没有任何关系;在MongoDB中,使用子集合来组织数据非常高效,值得推荐。
3)当第一个文档插入时,集合就会被创建。合法的集合名:
- 集合名不能是空字符串""。
- 集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
- 集合名不能以"system."开头,这是为系统集合保留的前缀。
- 用户创建的集合名字不能含有保留字符。
3、数据库:在MongoDB中,多个文档组成集合,多个集合可以组成数据库
数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串: #1、不能是空字符串("")。 #2、不得含有' '(空格)、.、$、/、\和\0 (空字符)。 #3、应全部小写。 #4、最多64字节。 有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。 #1、admin: 从身份认证的角度讲,这是“root”数据库,如果将一个用户添加到admin数据库,这个用户将自动获得所有数据库的权限。 再者,一些特定的服务器端命令也只能从admin数据库运行,如列出所有数据库或关闭服务器 #2、local: 这个数据库永远都不可以复制,且一台服务器上的所有本地集合都可以存储在这个数据库中 #3、config: MongoDB用于分片设置时,分片信息会存储在config数据库中
4、强调:把数据库名添加到集合名前,得到集合的完全限定名,即命名空间
- 例如:
如果要使用cms数据库中的blog.posts集合,这个集合的命名空间就是
cmd.blog.posts。命名空间的长度不得超过121个字节,且在实际使用中应该小于100个字节
三、基本数据类型
1、在概念上,MongoDB的文档与Javascript的对象相近,因而可以认为它类似于JSON。JSON(http://www.json.org)是一种简单的数据表示方式:
其规范仅用一段文字就能描述清楚(其官网证明了这点),且仅包含六种数据类型。
2、这样有很多好处:易于理解、易于解析、易于记忆。然而因为只有null、布尔、数字、字符串、数字和对象这几种数据类型,
所以JSON的表达能力有一定的局限。
3、虽然JSON具备的这些类型已经具有很强的表现力,但绝大数应用(尤其是在与数据库打交道时)都还需要其他一些重要的类型。
例如,JSON没有日期类型,这使得原本容易的日期处理变得麻烦。另外,JSON只有一种数字类型,无法区分浮点数和整数,更别说区分32位和64位了。
再者JSON无法表示其他一些通用类型,如正则表达式或函数。
4、MongoDB在保留了JSON基本键/值对特性的基础上,添加了其他一些数据类型。在不同的编程语言下,这些类型的确切表示有些许差异。
下面说明了MongoDB支持的其他通用类型,以及如何在文档中使用它们:
#1、null:用于表示空或不存在的字段 d={'x':null} #2、布尔型:true和false d={'x':true,'y':false} #3、数值 d={'x':3,'y':3.1415926} #4、字符串 d={'x':'egon'} #5、日期 d={'x':new Date()} d.x.getHours() #6、正则表达式 d={'pattern':/^egon.*?nb$/i} 正则写在//内,后面的i代表: i 忽略大小写 m 多行匹配模式 x 忽略非转义的空白字符 s 单行匹配模式 #7、数组 d={'x':[1,'a','v']} #8、内嵌文档 user={'name':'egon','addr':{'country':'China','city':'YT'}} user.addr.country #9、对象id:是一个12字节的ID,是文档的唯一标识,不可变 d={'x':ObjectId()}
5、_id和ObjectId
MongoDB基本知识就这些,下篇讲解curd操作