MongoDB是由C++语言编写的基于分布式文件存储的开源数据库系统,为Web应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库中功能最丰富、最像关系数据库的数据库。它支持的数据结构非常松散,可以存储比较复杂的数据类型。MongoDB 的特点是支持的查询语言非常强大,其语法类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
MongoDB 是面向集合、模式自由的文档数据库,其数据被分组存储在数据集[被称为一个集合(collection)]中;每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档;它不需要定义任何模式,可以把不同结构的文件存储在同一个数据库里。存储在集合中的文档为键值对的形式。每个文档可以匹配所表示实体的数据域,数据关系可以有引用和嵌入文档:引用文档通过包含链接或从一个文档到另一个文档的引用来存储数据关系;嵌入文档通过把数据存储到一个独立文档结构中来获取数据之间的关系,将一个文档结构嵌入到另一个文档的字段或者数组中。MongoDB的写操作在文档级别是原子性的。
MongoDB 的数据模型包括的基本概念是文档、集合、数据库。文档是数据的基本单元和核心概念,集合可以被看作没有模式的表,每个实例都可容纳多个独立数据库,每个数据库都有自己的集合和权限(数据库)。
文档(Document)是数据的基本单元,类似于关系数据库系统中的行(比行更复杂);集合(Collection)就是一组文档,集合类似关系数据库中的表;每一个文档都有一个特殊的键,在文档的集合中是唯一的,相当于关系数据库中表的主键。图7-10给出MongoDB的组成。
图7-10 MongoDB的组成
1.文档
多个键及其关联的值有序地放置在一起就是文档。文档是一组键值对,不需要设置相同的字段,相同的字段也不需要相同的数据类型。一个文档包含一组字段,每一个字段都是一个键值对,其中键为字符串类型,值包含字符串、整型数值、浮点数、布尔型、时间戳、二进制型、二进制数组、空值型、数组、日期、代码、对象标志、对象类型、文档、正则表达式等类型的数据。文档有单键值文档{“”userName”:”BBS11″},多键值文档{ “id” :ObjectId(“58097dfe7e6d64baca852729”), “name” : “test”, “add”: “china” },文档中的键值对是有序的。文档中的值可以是双引号里面的字符串,也可以是几种数据类型(甚至可以是整个嵌入的文档)。MongoDB文档不能有重复的键,文档的键是字符串。
2.集合
把一组相关的文档放到一起就组成了集合,集合是模式自由的,一个集合里面的文档可以是各式各样的。例如:下面两个文档可以出现在同一集合中。
{“name”:”arthur”}
{“name”:”arthur”,”sex”:”male”}
虽然键不同、值的类型也不同,但是它们可以存放在同一个集合中,不同模式的文档都可以放在同一个集合中。集合可以存放任何类型的文档,在实际使用时为了管理和查询方便,我们将文档分类存放在不同的集合中。例如,网站的日志记录可根据日志的级别进行存储, Info级别日志存放在Info 集合中,Debug级别日志存放在Debug 集合中,方便管理也提供查询性能。使用“.”按照命名空间将集合划分为子集合。
MongoDB提供了一些特殊功能的集合,例如:Capped collections 就是固定大小的集合,具有性能高和队列过期的特性(过期按照插入的顺序),该类集合的数据存储空间值是提前分配的;指定的存储大小包含了数据库的头信息;添加新的对象、更新对象,不会增加存储空间;数据库不允许进行删除;使用 drop()方法删除集合所有的行。元数据是定义数据的数据,数据库的信息存储在集合中,使用了系统的命名空间,MongoDB 数据库中的名字空间<dbname>.system.* 是包含多种系统信息的特殊集合,例如 dbname.system.indexes 包含所有索引,dbname.system.profile包含数据库概要(profile)信息,dbname.system.users包含数据库的用户等,这些集合是由系统进行管理的。
3.数据库
多个文档组成集合,多个集合组成数据库,一个 MongoDB 实例可承载多个数据库,互相之间彼此独立;开发中通常将一个应用(或同一种业务类型)的所有数据存放到同一个数据库中;磁盘上,MongoDB将不同数据库存放在不同文件中。一个MongoDB可以建立多个数据库,一个数据库可以包含一个集合,一个集合可以包含一组文档。MongoDB 的默认数据库为“db”,该数据库存储在 data 目录中。把数据库名添加到集合名前面,中间用点号连接,得到集合的完全限定名,就是命名空间,例如命名空间 mymongo.log,点号可以出现在集合名字中;再如mymongo.log.info,可将info集合看作log的子集合。子集合可让我们更好地组织数据,使数据的结构更加清晰明了。