6.1 简介
MongoDB是C++编写的、基于分布式文件存储的开源NoSQL(Not Only SQL的缩写,意思是“不仅仅是SQL”)数据库系统。它是一个介于关系数据库和非关系数据库之间的产品,旨在为Web应用提供可扩展的高性能数据存储解决方案。
在高负载的情况下,通过添加更多的节点,可以保证服务器性能。
MongoDB将数据存储为一个文档,数据结构由“键-值对”(Key-Value Pair)组成,是一种被称为“BeJSON”的类JSON数据。
{ name: "test", status: "ok", "favorites": ["writing"] }
6.1.1 主要特点
· MongoDB是一个面向文档存储的数据库,操作起来比较简单。
· 通过增加节点可以提高服务器的性能(分片、分布式)。
· MongoDB支持丰富的查询表达式,查询指令使用类似JSON的语法,可以查询内嵌文档中的对象和数组。
· MongoDB是一个“最像”关系数据库的NoSQL数据库。
6.1.2 概念
不管学习何种数据库都需要明白其中的基础概念,MongoDB的基础概念是文档、集合、数据库。表6-1所示对比传统关系型数据库进行介绍。
表6-1 传统关系型数据库与MongoDB术语比较
为了便于理解,我们对比一下同样的数据在SQL数据库和MongoDB数据库中存储的区别。
1.SQL中的存储
2.MongoDB中的存储
{ "_id":ObjectId("5dcb9dab8efcaa346e94537a"), "username":"demo", "email":"demo@demo.com", "created_at":"2000-01-01" }
6.1.3 数据库
MongoDB的数据库可以看作是关系数据库中的数据库,一个服务器实例可以建立多个独立的数据库,每一个数据库都有自己的权限和数据,数据内容也存放在不同的文件中。
下面是MongoDB数据库的常用命令。
6.1.4 集合
MongoDB的集合可以看作关系数据库中的表,用于存放一组数据,但是MongoDB和SQL数据库有一个最大的区别:
· 关系数据库的数据是结构化的,需要先定义表结构才能插入数据,要求每个数据行的结构一致。
· MongoDB的数据是非结构化的,不需要定义表,每个数据(文档)之间的结构也不要求一致。
集合的命名规则:
· 集合名不能为空。
· 集合名不能含有'\0'字符,该字符表示字符串的结尾。
· 集合名不能以“system.”开头,这是MongoDB保留使用的。
6.1.5 文档
MongoDB的文档可以看作关系数据库中的数据行,但是MongoDB中同一个集合的文档结构不要求一致,也就是说下面两个文档是合法的。
> db.blog.find() { "_id" : ObjectId("5dcb9dab8efcaa346e94537a"), "title" : "test", "content" : " 你好" } { "_id" : ObjectId("5dcba1a18efcaa346e94537b"), "name" : "xialei" }
需要注意的是:
· 文档中的“键-值对”是有序的。
· 文档支持丰富的数据类型,包含简单类型甚至嵌套文档。
· 文档区分数据类型和字母大小写。
· 文档不能有重复的键。
文档键名的规范:
· 键不能含有'\0'。这个字符用来表示字符串的结尾。
· 不建议键名包含'.'和'$',这是MongoDB命令用到的字符。
· 不建议键名以下划线开头,这个是MongoDB保留的。
MongoDB支持的数据类型:
· String:MongoDB只支持UTF-8编码的字符串。
· Integer:根据服务器位数,可分为32位和64位整型。
· Boolean:存储布尔值true/false。
· Double:双精度浮点值。
· Array:数组。
· Timestamp:时间戳,记录文档添加或修改的时间。
· Object:对象或嵌套文档。
· Null:空值。
· Date:日期时间。用UNIX时间格式来存储日期或时间,一般用Timestamp多一点。
· Object ID:文档的ID。
· Binary Data:二进制数据。
· Code:JavaScript代码。
· Regular Express:正则表达式。
比较常用的数据类型有Boolean、String、Timestamp、Integer、Object、Array。