MongoDB概述

170 阅读8分钟

在这里插入图片描述

要相信,你每走的每一步都算数。

最近学校开了一科非关系型数据库(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社区版;

下载地址:www.mongodb.com/try/downloa…

在这里插入图片描述 版本的选择:

  • 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目录结构:

在这里插入图片描述 <br/>


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可视化工具

...


示例:使用VSCode插件连接MongoDB数据库 在这里插入图片描述 在这里插入图片描述