1、MongoDB简介
1.1、什么是MongoDB
一个基于分布式的文件存储数据库,旨在简化开发和扩展。属于NoSQL数据库,由C 语言编写,为web应用提供可扩展的高性能数据存储解决方案。
【参考MongoDB 4.2 中文手册】:参考_MonogDB 中文网
1.2、特点
MongoDB是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库当中功能最丰富,最像关系数据库的。
查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。拥有丰富的数据类型。
MongoDB的记录是一个文档,它由字段和值对组成的数据结构。MongoDB文档类似于JSON对象。字段的值可以包括其他文档,数组和文档数组。
除集合外,MongoDB还支持:只读视图,按需实例化视图。
MongoDB提供高性能的数据持久性:
- 对嵌入式数据模型的支持减少了数据库系统上的I/O活动;
- 索引支持更快的查询,并且可以包括来自嵌入式文档和数组的键。
1.3、MongoDB历史
2007 年,Dwight Merriman,Eliot Horowitz 和 Kevin Ryan 成立 10gen 软件公司,在成立之初,这家的公司目标是进军云计算行业,为企业提供云计算服务。在开发云计算产品时,他们准备开发一个类似于数据库的组件,为云计算产品提供存储服务。当时是关系型数据库一统天下的时间,他们觉得传统的关系型数据库无法满足他们的要求,他们想要一款程序员不懂SQL语言也可以使用的数据存储产品。
在网络上找了一圈,不管是开源的还是闭源的产品,都没找到让他们满意的东西,既然找不到,那就自己开发吧,反正他们也有那个技术实力,10gen 的创始人都来自谷歌,他们创建的网络广告公司 DoubleClick 被谷歌收购了,这是他们的第二次创业。
10gen 公司不使用关系型数据库是有一定原因的,当时他们还在 DoubleClick 公司的时候,就吃过关系型数据库的苦头。DoubleClick 是一家网络广告公司,服务美国众多的知名公司,该公司每秒提供 40 万个广告,但在可伸缩性和敏捷性方面经常遇到困难,因此他们不得不经常自己开发和使用许多自定义数据存储来解决现有关系型数据库的不足,这让他们很是苦恼。
因此他们决定开发一款数据库产品解决他们在 DoubleClick 时遇到的问题,并为自己的云计算产品提供存储服务。
- MongoDB 最初于 2007 年开发,由位于纽约的一个名为 10gen 的组织开发,现在被称为 MongoDB Inc.
- 2009 年,经过将近 2 年的开发,10gen 开发出了 MongoDB 的雏形并将它开源以及正式命名为 MongoDB,同时成立开源社区,通过社区运营 MongoDB。
- 2009 年 02 月 MongoDB 1.0 发布,提供了大部分基本的查询功能。
- 2009 年 12 月 MongoDB 1.2 发布,引入了 map-reduce,支持大规模数据处理。
- MongoDB 的第一个真正产品是从 2010 年 03 月发布的 MongoDB 1.4 版本开始的。
- 2010 年 8 月 MongoDB 1.6 发布,引入了一些主要特性,比如用于水平伸缩的分片、具备自动故障转移能力的副本集以及对 IPv6 的支持。
- 2012 年 05 月 23 日,MongoDB 2.1 发布。该版本采用全新架构,包含诸多增强。
- 2012 年 06 月 06 日,MongoDB 2.0.6 发布,分布式文档数据库。
- 2012 年 8 月 MongoDB 2.2 发布,引入了聚合管道,可以将多个数据处理步骤组合成一个操作链。
- 2013 年 MongoDB 推出第一款商业版本 MongoDB Enterprise Advanced。
- 2013 年 04 月 23 日,MongoDB 2.4.3 发布,此版本包括了一些性能优化,功能增强以及 bug 修复。
- 2013 年 08 月 20 日,MongoDB 2.4.6 发布,仍然是以性能优化,功能增强和 bug 修复为主。
- 2015 年 03 月 MongoDB 3.0 发布,包含了新的 WiredTiger 存储引擎、可插拔存储引擎 API、增加了 50 个副本集限制和安全改进。同年晚些时候又发布了 3.2 版本,支持文档验证、部分索引和一些主要的聚合增强。
- 2016 年 MongoDB 推出了 Atlas 服务,MongoDB Atlas,与公有云服务厂商(谷歌、微软Azure)合作。这一年,MongoDB 爆出了非常严重的安全门事件,黑客通过 MongoDB 的默认监听地址 0.0.0.0 删除数据,并且通过此漏洞进行勒索,支付 0.2 到 0.5 的比特币就可以恢复数据。
- 2017 年 10 月 MongoDB 公司成立 10 周年之际,顺利通过 IPO 在纽交所上市。开盘 24 美元,公司估值达到 16 亿美元,并获得 1.92 美元的筹资。
- 2017 年 11 月 MongoDB 3.6 发布,为多集合连接查询、变更流和使用 JSON 模式进行文档验证提供了更好的支持。
- 2018 年 06 月 MongoDB 4.0 发布,这一版本的发布获得了广泛的关注,提供了跨文档事务处理能力。这是一个重要的里程碑,MongoDB 已经为高数据完整性需求做好了准备。
- 2019 年 03 月 18 日,Forrester 授予 MongoDB NoSQL 领导者称号。
- 2019 年 10 月 MongoDB 4.2 发布,开始支持分布式事务。
- 截至 2020 年 10 月,MongoDB 的社区版版本是 4.4.1,扩展性和性能增强,降低复制延迟,可用性和容错性增强,查询能力和易用性增强,MongoDB 云平台的功能更新。MongoDB 逐渐的从一个专注于数据库服务的厂商,转变为提供数据平台服务的厂商。
1.4、MongoDB与关系型数据库术语对比
SQL 术语概念 | MongoDB 术语概念 |
---|---|
database(数据库) | database(数据库) |
table(表) | collection(集合) |
row(行) | document(文档) |
column(列) | field(字段) |
index(索引) | index(索引) |
table joins(表连接) | embedded documents and linking(嵌入的文档和链接) |
指定任意唯一的列或列组合作为主键 | 主键被自动设置为 _id 字段,也可以自定义其它列作为主键 |
1.5、MongoDB数据类型
数据类型 | 描述 |
---|---|
String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 |
Boolean | 布尔值。用于存储布尔值(真/假)。 |
Double | 双精度浮点值。用于存储浮点值。 |
Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 |
Arrays | 用于将数组或列表或多个值存储为一个键。 |
Timestamp | 时间戳。记录文档修改或添加的具体时间。 |
Object | 用于内嵌文档。 |
Null | 用于创建空值。 |
Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 |
Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |
Object ID | 对象 ID。用于创建文档的 ID。 |
Binary Data | 二进制数据。用于存储二进制数据。 |
Code | 代码类型。用于在文档中存储 JavaScript 代码。 |
Regular expression | 正则表达式类型。用于存储正则表达式。 |
2、Linux环境下安装MongoDB
这里在CentOS Linux上安装MongoDB 社区版。
官网教程参考:在Red Hat上安装_MonogDB 中文网
2.1、下载
官网社区版下载地址:MongoDB Community Download | MongoDB
2.2、安装
代码语言:javascript复制将下载的资源上传至服务器/usr/local/src,解压至/usr/local 并重命名为 mongodb。
# 解压 mongodb 至指定目录
tar -zxvf /usr/local/src/mongodb-linux-x86_64-rhel70-5.0.6.tgz -C /usr/local/
# 重命名解压目录为 mongodb
mv /usr/local/mongodb-linux-x86_64-rhel70-5.0.6/ /usr/local/mongodb
2.3、创建数据/日志目录
代码语言:javascript复制创建用于存放数据和日志的文件夹,并修改其权限增加读写权限。
# 创建存放数据的目录
mkdir -p /usr/local/mongodb/data/db
# 创建存放日志的目录
mkdir -p /usr/local/mongodb/logs
# 创建日志记录文件
touch /usr/local/mongodb/logs/mongodb.log
至此MongoDB就安装完成了。
2.4、添加环境变量
将 MongoDB 相关目录添加至系统环境变量,这样在任意目录都能进行操作 MongoDB ,比如启动服务,客户端进行连接等。
(1)先通过vi /etc/profile编辑系统环境变量文件,添加以下内容:
代码语言:javascript复制# 添加环境变量
export MONGODB_HOME=/usr/local/mongodb
export PATH=$PATH:$MONGODB_HOME/bin
(2)然后通过source /etc/profile重新加载系统环境变量。这样在系统任意目录下都可以直接操作 MongoDB 了。
3、服务端启动MongoDB
3.1、前台启动
代码语言:javascript复制MongoDB的默认启动方式为前台启动。所谓的前台启动就是 MongoDB 启动进程后会占用当前的终端窗口。
# 切换至指定目录
cd /usr/local/mongodb/
# 前台启动
bin/mongod --dbpath /usr/local/mongodb/data/db/ --logpath /usr/local/mongodb/logs/mongodb.log --logappend --port 27017 --bind_ip 0.0.0.0
- mogod:相当于守护进程,后面跟一些参数
- –dbpath:指定数据文件存放目录
- –logpath:指定日志文件,注意是指定文件不是目录
- –logappend:使用追加的方式记录日志
- –port:指定端口,默认为 27017
- –bind_ip:绑定服务 IP,若绑定 127.0.0.1,则只能本机访问,默认为本机地址
3.2、后台启动
代码语言:javascript复制所谓的后台启动就是以守护进程的方式启动 MongoDB。命令中添加--fork即可。
# 后台启动
bin/mongod --dbpath /usr/local/mongodb/data/db/ --logpath /usr/local/mongodb/logs/mongodb.log --logappend --port 27017 --bind_ip 0.0.0.0 --fork
通过命令启动的方式并不适合管理,毕竟每次输入命令都需要考虑各参数的配置。一般通过配置文件来配置启动参数,然后通过指定配置文件的方式启动服务,这样在管理 MongoDB 上就比较方便了。
在bin目录下增加一个mongodb.conf配置文件
代码语言:javascript复制# 数据文件存放目录
dbpath = /usr/local/mongodb/data/db
# 日志文件存放目录
logpath = /usr/local/mongodb/logs/mongodb.log
# 以追加的方式记录日志
logappend = true
# 端口默认为 27017
port = 27017
# 对访问 IP 地址不做限制,默认为本机地址
bind_ip = 0.0.0.0
# 以守护进程的方式启用,即在后台运行
fork = true
启动
代码语言:javascript复制# 指定配置文件的方式启动服务
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/bin/mongodb.conf
3.3、客户端访问MongoDB
MongoDB提供命令进行访问,在控制台直接输入:mongo
如果允许的情况下,使用可视化工具Navicat操作更方便。
3.4、关闭MongoDB
前台启动关闭:使用 Ctrl c 即可关闭。
后台启动关闭:使用 --shutdown参数即可关闭。
代码语言:javascript复制# 命令启动方式的关闭
bin/mongod --dbpath /usr/local/mongodb/data/db/ --logpath /usr/local/mongodb/logs/mongodb.log --logappend --port 27017 --bind_ip 0.0.0.0 --fork --shutdown
# 配置文件启动方式的关闭
mongod -f /usr/local/mongodb/bin/mongodb.conf --shutdown
kill命令关闭
代码语言:javascript复制通过 kill -9的方式强制关闭进程,慎用。
# 查看 mongodb 运行的进程信息
ps -ef | grep mongodb
# kill -9 强制关闭
kill -9 pid
MongoDB函数关闭
连接到MongoDB服务后,切换到admin数据库,并使用相关函数关闭服务。
代码语言:javascript复制# 切换 admin 数据库
use admin
# 执行以下函数(2选1)即可关闭服务
db.shutdownServer()
db.runCommand(“shutdown”)