要相信,你每走的每一步都算数。
最近学校开了一科非关系型数据库(NoSQL),于是在B站上搜集了许多关于MongoDB的视频:
www.bilibili.com/video/BV15k…
www.bilibili.com/video/BV1kr…
www.bilibili.com/video/BV1bJ…
www.bilibili.com/video/BV1xz…
1、什么是NoSQL
- NoSQL是一种非关系型DMS,不需要对数据架构进行任何形式的定义,可以避免JOIN连接,并且易于扩展。
- NoSQL数据库用于具有庞大数据存储需求的分布式数据存储。
- NoSQL用于大数据和实时Web应用程序。
- 传统的RDBMS使用SQL语法来存储和查询数据。相反,NoSQL数据库系统包含可存储结构化、半结构化、非结构化和多态数据的多种数据库技术。
- 为什么使用NoSQL:因为使用RDBMS来处理海量数据时,会影响系统的性能和响应时间。 为了解决此问题,可以通过升级现有硬件来 “纵向扩展” 我们的系统。但这个成本很高。 另一种方案是采用多服务器,通过集群(Cluster)一起处理数据。这种方法称为“横向扩展”。
- NoSQL数据库是非关系数据库,因此在设计时考虑到Web应用程序,比关系数据库更容易扩展。
- NoSQL数据存储模式:包括键值存储模式(以Redis为基础)、文档存储模式(以MongoDB为基础)、列族存储模式(如:Cassandra、HBase)、图存储模式(如:Neo4J、InfoGrid)。
2、什么是MongoDB
MongoDB 官网:www.mongodb.com/
MongoDB 中文社区:www.mongodb.org.cn/
MongoDB是面向文档的NoSQL数据库,用于大量数据存储。它是C++编写的,问世于2000年代中期。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,数据格式是 BSON,一种类似 JSON 的二进制形式的存储格式,简称 Binary JSON,和 JSON 一样支持内嵌的文档对象和数组对象,因此可以存储比较复杂的数据类型。MongoDB最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
原则上Oracle和MySQL上能做的事情,MongoDB都能做(包括ACID事务)。
MongoDB概念与关系型数据库(RDBMS)非常相似:
| SQL概念 | MongoDB概念 |
|---|---|
| 数据库(database) | 数据库(database) |
| 表(table) | 集合(collection) |
| 行(row) | 文档(document) |
| 列(column) | 字段(field) |
| 索引(index) | 索引(index) |
| 主键(primary key) | _id(字段) |
| 视图(view) | 视图(view) |
| 表连接(table join) | 聚合操作($lookup) |
MongoDB与RDBMS的差异
半结构化,在一个集合中,文档所拥有的字段并不需要是相同的,而且也不需要对所用的字段进行声明。因此MongoDB具有很明显的半结构化特点。除了松散的表结构,文档还可以支持多级的嵌套、数组等灵活的数据类型、非常契合面向对象的编程模型;弱关系,MongoDB没有外键约束,也没有非常强大的表连接能力,类似的功能需要使用聚合管道技术来弥补;
MongoDB的优势
- MongoDB基于灵活的JSON文档模型,非常适合敏捷式的快速开发。
- 与此同时,它具有高可用、高水平扩展的能力,使得它在处理海量、高并发的数据应用时颇具有优势;
MongoDB的应用
- 游戏场景,使用MongoDB存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新;
- 物流场景,使用MongoDB存储订单信息,订单状态在运送过程中会不断更新,以MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来;
- 社交场景,使用MongoDB存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能;
- 物联网场景,使用MongoDB存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析;
- 视频直播,使用MongoDB存储用户信息、礼物信息等;
- 大数据应用,使用云数据库MongoDB作为大数据的云存储系统,随时进行数据提取分析,掌握行业动态;
3、单机部署
本文以Linux系统CentOS7为例,安装MongoDB社区版;
版本的选择:
- MongoDB的版本命名规范如:x.y.z;
- y 为奇数时,表示当前版本为开发版,如3.5.2;
- y 为偶数时,表示当前版本为稳定版,如3.6.2;
- z 是修正版本,数字越大越好;
1、切到 /usr/local 目录中(用户级的程序目录)
cd /usr/local
2、下载MongoDB
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.12.tgz
3、解压文件
tar -zxvf mongodb-linux-x86_64-rhel70-4.4.12.tgz
4、修改目录名
mv mongodb-linux-x86_64-rhel70-4.4.12 mongodb
5、配置环境变量
vim /etc/profile
在文件尾部添加以下内容:
# MongoDB Environment
export MONGODB_HOME=/usr/local/mongodb
export PATH=$PATH:$MONGODB_HOME/bin
然后更新一下文件:
source /etc/profile
6、切到mongodb目录,然后创建几个文件夹用来存储数据和日志
# 数据存储路径
mkdir -p ./data/db
# 日志文件存储路径
mkdir -p ./log
7、在mongodb目录中,新建 mongod.conf 配置文件
vi mongod.conf
并添加以下内容:(数据内容是:yaml格式的)
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
#The path of the log file to which mongod or mongos should send all diagnostic logging information
destination: file
#mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
path: "/usr/local/mongodb/log/mongod.log"
#当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
logAppend: true
storage:
#mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。
dbPath: "/usr/local/mongodb/data/db"
journal:
#启用或禁用持久性日志以确保数据文件保持有效和可恢复。
enabled: true
processManagement:
#启用在后台运行mongos或mongod进程的守护进程模式。
fork: true
net:
#服务实例绑定的IP,默认是localhost
# 局域网ip:10.0.8.83
bindIp: 127.0.0.1,10.0.8.83
#bindIp
#绑定的端口,默认是27017
port: 27017
mongodb目录结构:
8、启动mongodb服务
切到mongodb/bin目录,执行下面的命令:
mongod -f ../mongod.conf
或者
mongod --config ../mongod.conf
通过进程来查看服务是否启动成功:
ps -ef |grep mongod
9、使用 compass远程连接
输入远程连接的ip地址和端口号:
系统会默认创建这三个库:
- admin:主要存储MongoDB的用户、角色等信息;
- config:主要存储分片集群基础信息;
- local:主要存储副本集的元数据;
注:如果远程连不上的话,需要对防火墙配置一些信息或者把它关掉!
# 查看防火墙的状态
systemctl status firewalld
# 关闭防火墙
systemctl stop firewalld
# 设置开机禁用防火墙
systemctl disable firewalld.service
扩展:使用MongoDB Shell 连接MongoDB 服务器:
mongo
或
mongo --host=127.0.0.1 --port=27017
10、停止服务
方式一:使用系统的 kill 命令直接杀死进程(数据可能会出错)
杀完要检查一下,避免有的它没有杀掉;
# 通过进程编号关闭节点
kill -2 pid
扩展(如果一旦因为数据损坏,则需要进行以下操作):
# 1、删除lock文件:
rm -f /mongodb/data/db/*.lock
# 2、修复数据:
mongod --repair --dbpath=/mongodb/data/db
或者使用shell命令关闭:
mongod -f ../mongod.conf --shutdown
方式二:通过mongo客户端中的shutdownServer命令关闭服务
# 客户端登录服务,注意,这里通过localhost登录,如果需要远程登录,必须先登录认证才行。
mongo --port 27017
# 切换到admin库
use admin
# 关闭服务
db.shutdownServer()
4、Mongo Shell的使用
Mongo 是MongoDB的交互式 JavaScrip Shell界面,它为系统管理员提供了强大的界面,并为开发人员提供了直接测试数据库查询和操作的方法。
4.1、使用Shell连接MongoDB
语法格式如下:
mongo [--port=xxx] [--host=localhost]
#####################################
--port:端口,默认为27017
--host:连接的主机地址,默认为127.0.0.1
4.2、JavaScript支持
Mongo Shell 是基于JavaScript语法的,MongoDB使用了SpiderMonkey作为其内部的JavaScript解释器引擎,这是由Mozilla官方提供的JavaScript内核解释器,该解释器也被同样用于大名鼎鼎的Firefox浏览器产品之中。SpiderMonkey对ECMA Script标准兼容性非常好,可以支持ECMA Script 6。可以通过下面的命令检查JavaScript解释器的版本:
interpreterVersion()
4.3、 Mongo Shell常用命令
| 命令 | 说明 |
|---|---|
| show dbs 或 show databases | 显示数据库列表 |
| use 数据库名 | 切换数据库,如果这个数据库不存在就创建该数据库 |
| show collections 或 show tables | 显示当前数据库的集合列表 |
| db.getCollectionNames() | 显示当前数据库的集合名称 |
| db.stats() | 查看某数据库详情 |
| db.集合名.stats() | 查看集合详情 |
| db.集合名.drop() | 删除集合 |
| show users | 显示当前数据库的用户列表 |
| show roles | 显示当前数据库的角色列表 |
| show profile | 显示最近发生的操作 |
| load("xxx.js") | 执行一个JavaScript脚本文件 |
| exit 或 quit() | 退出当前shell |
| help | 帮助文档,可以查看一些MongoShell命令 |
| db.help() | 查看当前数据库支持的方法 |
| db.集合名.help() | 显示集合的帮助信息 |
| db.集合名.count() | 显示集合中有多少个文档 |
| db.version() | 查看数据版本 |
4.4、数据库操作
# 查看所有库
show dbs
# 切到指定库或者创建该库
use 数据库名
# 删除当前数据库
db.dropDatabase()
4.5、集合操作
# 查看集合
show collections
# 创建集合
db.createCollection("集合名")
# 删除集合
db.集合名.drop()
创建集合的语法:
db.createCollection(name,options)
参数说明:
- name: 要创建集合的名称(对应RDB的表)
- options: 可选参数, 指定有关内存大小及索引的选项
options参数:
| 字段 | 类型 | 描述 |
|---|---|---|
| capped | 布尔 | (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。 |
| size | 数值 | (可选)为固定集合指定一个最大值,即字节数。如果 capped 为 true,也需要指定该字段。 |
| max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
注:当集合不在时,向集合中插入文档也会创建集合。
5、安全认证
创建管理员账号
# 切到admin库
use admin
# 创建管理员
db.createUser({user:"baidou",pwd:"123456",roles:["root"]})
# 查看所有用户信息
show users
# 删除用户
db.dropUser("baidou")
用户认证,返回1表示认证成功!
db.auth("baidou","123456")
创建应用数据库用户
# 创建数据库
use test
# 创建一个用户,然后该用户在当前库中有CRUD操作权限
db.createUser({user:"baidou",pwd:"123456",roles:["dbOwner"]})
# 用户认证
db.auth("baidou","123456")
默认情况下,MongoDB不会启动鉴权,以鉴权模式启动MongoDB:
# 首先关闭MongoDB服务
mongod -f ../mongod.congf --shutdown
# 以鉴权模式启动MongoDB
mongod -f ../mongod.congf --auth
启动鉴权之后,连接MongoDB的相关操作都需要提供身份认证:
mongo --port 27017 -u baidou -p 123456 --authenticationDatabase=test
6、MongoDB可视化工具
- 官方提供的MongoDB Compass:www.mongodb.com/try/downloa…
- NoSQLBooster:nosqlbooster.com/downloads
- Robot3T,也是我最近常用的(老师上课给发的嘻嘻),robomongo.org/download
- VSCode插件(MongoDB for VS Code)
...
示例:使用VSCode插件连接MongoDB数据库