Node.js+Webpack开发实战
上QQ阅读APP看书,第一时间看更新

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。