NoSQL 简介
NoSQL 概念
NoSQL 全称 Not Only SQL,意即”不仅仅是 SQL”。我们每天产生的数据有很大一部分由关系数据库管理系统(RDBMS)来处理,通过应用实践证明,关系模型非常适合于客户服务器编程。NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至 2009 年趋势越发高涨。NoSQL 的拥护者们提倡运用非关系型的数据存储。
NoSQL 指的是非关系型的数据库,有时也称作 Not Only SQL 的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。NoSQL 用于超大规模数据的存储,例如谷歌或 Facebook 每天为他们的用户收集万亿比特的数据。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
分布式系统概念
分布式系统(distributed system)由多台计算机和通信的软件组件通过计算机网络连接(本地网络或广域网)组成。分布式系统是建立在网络之上的软件系统,正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。分布式系统可以应用在不同的平台上,如 PC、工作站、局域网和广域网等。
分布式计算的优点
可靠性(容错):系统中部分节点发生故障时,其他节点可以继续提供服务。
可扩展性:可以根据需要增加节点来提升系统整体处理能力。
资源共享:网络中的硬件和软件资源可以被多个节点共同访问和使用。
灵活性:系统可以方便地添加新功能或替换旧组件而不影响整体运行。
更快的速度:通过并行处理和任务分发,多个节点同时工作可以缩短处理时间。
开放系统:基于标准协议和接口,不同厂商的设备和系统可以互相通信。
更高的性能:通过分布式架构将负载分散到多个节点,单点压力降低,整体吞吐量提升。
RDBMS vs NoSQL
RDBMS 特点:
高度组织化结构化数据
结构化查询语言(SQL)
数据和关系都存储在单独的表中
数据操纵语言,数据定义语言
严格的一致性
基础事务
NoSQL 特点:
代表着不仅仅是 SQL
没有声明性查询语言
没有预定义的模式
键 – 值对存储,列存储,文档存储,图形数据库
最终一致性,而非 ACID 属性
非结构化和不可预知的数据
CAP 定理
高性能,高可用性和可伸缩性
MongoDB 简介
MongoDB 概述
MongoDB 是由 C++ 语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档、数组及文档数组。

MongoDB 有两个服务器版本:Community 和 Enterprise。
MongoDB 下载
可以在 MongoDB 官网下载安装包,地址为:https://www.mongodb.com/download-center#community
直接下载地址(目前最新版 4.2):
http://dl.mongodb.org/dl/win32/x86_64
http://downloads.mongodb.org/win32/mongodb-win32-x86_64-2012plus-4.2.4-signed.msi
MongoDB 提供很多语言的驱动包,可以通过这些语言去访问 MongoDB。
Windows 安装步骤
转到下载 MongoDB 安装程序的目录(.msi 文件),默认情况下是 Downloads 目录。双击 .msi 文件开始安装。
选择安装类型:可以选择”完整”(建议大多数用户使用)或”自定义”安装类型。”完整设置”选项会将 MongoDB 和 MongoDB 工具安装到默认位置。使用”自定义安装程序”选项,可以指定要安装的可执行文件以及安装位置。
服务配置:从 MongoDB 4.0 开始,可以在安装过程中将 MongoDB 设置为 Windows 服务,也可以仅安装二进制文件。以下内容将 MongoDB 安装并配置为 Windows 服务。从 MongoDB 4.0 开始,可以在安装过程中将 MongoDB 配置和启动为 Windows 服务,并在成功安装后启动 MongoDB 服务。
如果选择不将 MongoDB 配置为 Windows 服务,请取消勾选 Install MongoD as a Service。
创建一个 Windows 账号:mango,密码也是 mango。
MongoDB Compass 是一个图形界面管理工具,安装时可以选择不安装。中国大陆安装 MongoDB 数据库时,可以选择安装 Compass,但是容易卡死,原因是从美国服务器在线安装,可以手动下载后离线安装。
安装完成后需要重启电脑。

启动与连接
如果将 MongoDB 安装为 Windows 服务,成功安装后将启动 MongoDB 服务。要开始使用 MongoDB,请将 mongo.exe 连接到正在运行的 MongoDB 实例。可以在 Windows 资源管理器中转到 C:\Program Files\MongoDB\Server\4.2\bin\ 目录,双击 mongo.exe。
也可以使用配置文件配置 MongoDB 实例:<install directory>\bin\mongod.cfg
如果没有将 MongoDB 安装为 Windows 服务,仅安装了可执行文件,则必须手动启动 MongoDB 实例。
停止 MongoDB 服务
要停止或暂停 MongoDB 服务,使用服务控制台:在服务控制台中找到 MongoDB 服务,右键单击 MongoDB 服务,然后点击”停止”(或”暂停”)。
配置环境与启动连接

启动 MongoDB 数据库
要启动 MongoDB,需要运行 mongod.exe。基本启动命令如下:
"C:\Program Files\MongoDB\Server\4.2\bin\mongod.exe" --dbpath="c:\data\db"Code language: JavaScript (javascript)
–dbpath 选项指向数据库目录,该目录必须提前存在。可以配置环境变量,将 MongoDB 的 bin 目录加入 PATH,这样就无需每次输入完整路径。
如果 MongoDB 数据库服务器运行正常,命令解释器会显示如下信息:
[initandlisten] waiting for connectionsCode language: CSS (css)

连接到 MongoDB
要将 mongo.exe 外壳连接到 MongoDB 实例,需要打开另一个具有管理权限的命令解释器,然后运行 mongo.exe。
"C:\Program Files\MongoDB\Server\4.2\bin\mongo.exe"Code language: CSS (css)
或者配置好环境变量后直接输入:
mongo
默认绑定地址说明
默认情况下,MongoDB 在启动时 bindIp 设置为 127.0.0.1,该绑定到 localhost 网络接口。这意味着 mongod.exe 只能接受来自同一计算机上运行的客户端的连接。除非将此值设置为有效的网络接口,否则远程客户端无法连接到 mongod.exe,且 mongod.exe 不能初始化副本集。
如果需要允许远程连接,可以在配置文件中修改 bindIp 参数,例如设置为 0.0.0.0 以监听所有网络接口,或指定具体的 IP 地址。修改配置文件 mongod.cfg 中的 net.bindIp 字段后重启服务生效。
MongoDB 概念解析
SQL 与 MongoDB 术语对照
| SQL 术语/概念 | MongoDB 术语/概念 | 解释/说明 |
|---|---|---|
| database | database | 数据库 |
| table | collection | 数据库表/集合 |
| row | document | 数据记录行/文档 |
| column | field | 数据字段/域 |
| index | index | 索引 |
| table joins | 不支持 | 表连接,MongoDB 不支持 |
| primary key | primary key | 主键,MongoDB 自动将 _id 字段设置为主键 |
数据库
一个 MongoDB 实例中可以建立多个数据库。MongoDB 的默认数据库为 “db”,该数据库存储在 data 目录中。MongoDB 的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。
show dbs 命令可以显示所有数据库的列表:
> show dbs
执行 db 命令可以显示当前数据库对象或集合:
> db
运行 use 命令可以连接到一个指定的数据库:
> use localCode language: PHP (php)
有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库:
admin:从权限的角度来看,这是 “root” 数据库。将用户添加到这个数据库,该用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
local:这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合。
config:当 Mongo 用于分片设置时,config 数据库在内部使用,用于保存分片的相关信息。
文档
文档是一组键值(key-value)对,即 BSON。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别。
一个简单的文档例子:
{"site":"www.foxdevelop.com", "name":"foxdevelop"}Code language: JSON / JSON with Comments (json)
集合
集合就是 MongoDB 文档组,类似于 RDBMS 中的表格。集合存在于数据库中,集合没有固定的结构,意味着可以对集合插入不同格式和类型的数据,但通常插入集合的数据都会有一定的关联性。
比如可以将以下不同数据结构的文档插入到同一个集合中:
{"site":"www.bing.com"}
{"site":"www.google.com","name":"Google"}
{"site":"www.foxdevelop.com","name":"foxdevelop","num":5}Code language: JSON / JSON with Comments (json)
当第一个文档插入时,集合就会被创建。
MongoDB 数据类型
下表为 MongoDB 中常用的几种数据类型:
| 数据类型 | 描述 |
|---|---|
| String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
| Integer | 整型数值。用于存储数值。根据服务器分为 32 位或 64 位。 |
| Boolean | 布尔值。用于存储布尔值(真/假)。 |
| Double | 双精度浮点值。用于存储浮点值。 |
| Min/Max keys | 将一个值与 BSON 元素的最低值和最高值相对比。 |
| Array | 用于将数组或列表或多个值存储为一个键。 |
| Timestamp | 时间戳。记录文档修改或添加的具体时间。 |
| Object | 用于内嵌文档。 |
| Null | 用于创建空值。 |
| Symbol | 符号。基本等同于字符串类型,用于采用特殊符号类型的语言。 |
| Date | 日期时间。用 UNIX 时间格式存储当前日期或时间。 |
| Object ID | 对象 ID。用于创建文档的 ID。 |
| Binary Data | 二进制数据。用于存储二进制数据。 |
| Code | 代码类型。用于在文档中存储 JavaScript 代码。 |
| Regular expression | 正则表达式类型。用于存储正则表达式。 |
ObjectId
ObjectId 类似唯一主键,可以很快生成和排序,包含 12 个字节,含义如下:
前 4 个字节表示创建 unix 时间戳,格林尼治时间 UTC 时间,比北京时间晚 8 个小时。
接下来的 3 个字节是机器标识码。
紧接的两个字节由进程 id 组成(PID)。
最后三个字节是随机数。
MongoDB 中存储的文档必须有一个 _id 键。这个键的值可以是任何类型的,默认是个 ObjectId 对象。
由于 ObjectId 中保存了创建的时间戳,不需要为文档单独保存时间戳字段,可以通过 getTimestamp 函数来获取文档的创建时间:
> var newObject = ObjectId()
> newObject.getTimestamp()Code language: JavaScript (javascript)
ObjectId 可以转为字符串形式。
日期
日期类型表示当前距离 Unix 新纪元(1970年1月1日)的毫秒数。日期类型是有符号的,负数表示 1970 年之前的日期。
> var mydate1 = new Date()
> mydate1
> typeof mydate1Code language: JavaScript (javascript)
new Date() 创建的是格林尼治时间对象,typeof 返回 object。
