NoSQL

NoSQL,指的是非关系型的数据库。而我们平时说的关系型数据库,就是SQL,NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。

NoSQL用于超大规模数据的存储;比如大数据。

而我们MongoDB就是属于非关系型的数据库。

什么是MongoDB

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

在高负载的情况下,添加更多的节点,可以保证服务器性能。

MongoDB将数据存储为一个文档,数据结构由键值对组成,类似于JSON格式,字段值可以包含其他文档、数组以及文档数组。

nosql 与 sql 的区别:

SQL术语/概念 MongoDB术语/概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins 表连接/MongoDB不支持
primary key primary key 主键/MongoDB自动将_id字段设置为主键

简单来说:

SQL: 数据库 -> 数据表 -> 数据记录行 -> 数据字段 等等…

NoSQL:数据库 -> 集合 -> 文档 等等…

数据库

  • 一个 mongodb 中可以建立多个数据库

  • MongoDB 的默认数据库为 db ,该数据库存储在 data 目录中。

  • MongoDB 的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限。

  • show dbs 命令可以显示所有数据的列表

  • 执行 db 命令可以显示当前数据库对象或集合

  • 运行 use 命令可以连接到一个指定的数据库

使用Linux部署MongoDB

下载二进制包

Linux 二进制文件下载地址:https://www.mongodb.com/try/download/community

这里学习将 MongoDB 4.2.24 安装在 Ubuntu 操作系统中进行演示。

image-20231031095549206

1
2
3
4
# 进入到相应目录
cd /usr/local
# Ubuntu中执行如下命令:
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1804-4.2.24.tgz

解压tar包

1
2
# 解压tar包
tar -zxvf mongodb-linux-x86_64-ubuntu1804-4.2.24.tgz

image-20231031100057106

创建相应目录

1
2
3
4
5
6
7
8
9
10
# 在 /usr/local 目录下创建mongodb目录
mkdir /usr/local/mongodb

# 在 /usr/local/mongodb 目录下创建所需目录
cd /usr/local/mongodb
mkdir data
mkdir logs

# 创建对应日志文件
touch /usr/local/mongodb/logs/mongodb.log

移除相应目录

将解压后的 mongodb-linux-x86_64-ubuntu1804-4.2.24 中的所有文件全部移动到 /usr/local/mongodb 中

注意 /* 是所有子文件

1
mv /usr/local/mongodb-linux-x86_64-ubuntu1804-4.2.24/*  /usr/local/mongodb/

删除无用的tar包:

1
rm -rf /usr/local/mongodb-linux-x86_64-ubuntu1804-4.2.24.tgz

设置MongoDB环境变量

也可以不用设置环境变量进行启动,但是不设置环境变量启动的话要每次启动写很多启动参数,比较麻烦,所以做好配置环境变量。

不配置环境变量的启动如下(不建议):

1
2
3
4
5
6
7
8
cd /usr/local/mongodb/bin
# 由于我这里是公网服务器,因此监听地址为127.0.0.1 不对外公开,如想对外,请修改为 0.0.0.0
./mongod --port=27017 --dbpath=/usr/local/mongodb/data \
--logpath=/usr/local/mongodb/logs/mongodb.log --bind_ip=127.0.0.1 --fork

# --port: 指定端口
# --dbpath: 指定数据文件存放目录 --logpath: 指定日志文件,注意是文件不是目录
# --bind_ip: 默认只监听localhost网卡 --fork: 后台启动

配置环境变量的启动:(建议)

1
vim /etc/profile

image-20231031101337959

添加MongoDB配置文件

1
vim /etc/mongodb.conf
1
2
3
4
5
6
7
8
9
10
11
12
#指定数据库路径
dbpath=/usr/local/mongodb/data
#指定MongoDB日志文件
logpath=/usr/local/mongodb/logs/mongodb.log
# 使用追加的方式写日志
logappend=true
#端口号
port=27017
# 这里只对本地监听,如果想要对外监听,请修改为 0.0.0.0
bind_ip=127.0.0.1
fork=true # 以守护进程的方式运行MongoDB,创建服务器进程
#auth=true #启用用户验证

MongoDB的启动与停止

启动MongoDB (-f 使用配置文件方式启动)

1
mongod -f /etc/mongodb.conf

image-20231031101817174

关闭 MongoDB(-f 使用配置文件方式关闭 )

1
mongod --shutdown -f /etc/mongodb.conf

查看进程:

1
ps -ef | grep mongod

image-20231031102129432

也可以杀死进程来关闭: kill -9 1527473(进程号)进行关闭。

MongoDB常用语法

进入到MongoDB命令行:

1
mongo

image-20231031103101398

列出当前所有数据库:

1
show dbs;   # show databases; 也可以 但是不太建议

进入到某个数据库:

1
use  Database_name;

创建一个数据库:

1
2
# 当前use了一个不存在的数据库时,这里会自动创建该数据库(前提需要在库中插入集合)
use Database_name;

例如:

image-20231031105953568

查看某个库下的所有集合

1
show tables; # 或使用 show collection 某些版本不支持该命令

创建一个集合

MongoDB 中使用 createCollection() 方法来创建集合。

语法格式:

1
db.createCollection(name, options)

参数说明:

  • name: 要创建的集合名称
  • options: 可选参数, 指定有关内存大小及索引的选项
字段 类型 描述
capped 布尔值 是否启用集合限制,如果开启需要制定一个限制条件,默认为不启用
size 布尔值 限制集合使用空间的大小,默认为没有限制
max 布尔值 集合中最大条数限制,默认为没有限制
autoIndexId 布尔值 是否使用_id作为索引,默认为使用(true或false)

例如:创建一个名为 users 的结合:

1
db.createCollection('users');

image-20231031113112176

在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。

在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。

在集合中插入数据:

语法格式:

1
db.集合名称.insert({数据})

示例:在users表中插入 "name":"xiaoming","age":19,"register_date":"2023-10-31"

1
db.users.insert({"name":"xiaoming","age":19,"register_date":"2023-10-31"});

image-20231031114041039

查看集合中的数据:

1
2
3
4
5
# 语法:
db.集合名称.find();

# 示例: 查看users集合中的数据
db.users.find();

image-20231031114110471

更新集合中的文档:

MongoDB 中使用 update() 方法来创建集合。

语法格式:

1
db.集合名称.update({k:v},{$set:{new_key:new_value}})

示例一:将 key 为 name,value 值为 xiao3,修改为:小三

1
db.info.update({"name":"xiao3"},{$set:{"name":"小三"}});

image-20231101084737898

image-20231101084749423

示例二:将 key 为 name, value 值为 xiao2 这个记录的 key为 age 值修改为18。

1
db.info.update({"name":"xiao2"},{$set:{"name":"小二","age":18}});

image-20231101085347241

删除文档:

MongoDB 中使用 remove() 方法来删除文档。

语法格式:

1
db.集合名称.remove({k:v});

示例:删除 name 值为 xiao三的文档(默认会匹配所有):

1
db.info.remove({"name":"小三"});

image-20231101091742904

示例二:删除 name 值为 小二的第一个匹配的文档:

1
db.info.remove({"name":"小三"},{justOne:true});

删除集合:

MongoDB 中使用 drop() 方法来删除集合。

语法格式:

1
db.集合名称.drop();

示例: 删除名为users的集合

1
db.users.drop();

image-20231031110902835

删除数据库:

1
2
# 删除数据库需要use到某个数据库下执行。
db.dropDatabase()

例如:删除 information 数据库:

image-20231031111321097

mongoimport 导入数据

准备如下 JSON 数据,将其保存为 test.json

1
{"name":"xiao1","age":1}{"name":"xiao2","age":2}{"name":"xiao3","age":3}{"name":"xiao4","age":4}{"name":"xiao5","age":5}{"name":"xiao6","age":6}{"name":"xiao7","age":8}{"name":"xiao9","age":9}{"name":"xiao10","age":10}{"name":"xiao11","age":11}{"name":"xiao12","age":12}{"name":"xiao13","age":13}{"name":"xiao14","age":14}{"name":"xiao15","age":15}{"name":"xiao16","age":16}{"name":"xiao17","age":17}{"name":"xiao18","age":18}{"name":"xiao19","age":19}{"name":"xiao20","age":20}

使用 mongoimport 工具,将其导入到 MongoDB test 库下的 info 集合中:

1
mongoimport --db test --collection info --drop --file test.json

image-20231031222827161

将其导入到 MongoDB 数据库,方便后续的查询操作。

MongoDB查询文档

基础知识

MongoDB 查询文档使用 find() 方法。

find() 方法以非结构化的方式来显示所有文档。

语法:

MongoDB 查询数据的语法格式如下:

1
db.collectionName.find(query, projection)
  • query :可选,使用查询操作符指定查询条件
  • projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

image-20231031163424975

如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:

image-20231031163452261

除了 find() 方法之外,还有一个 findOne() 方法,它只返回一个文档。

image-20231031163534689

find条件查询

1
2
3
4
5
6
7
8
######## 其中collectionName表示集合的名称
db.collectionName.find() # 查询所有文档
db.collectionName.find({k : v}) # 查询k的值为v的文档
db.collectionName.find({k1 : v2, k2 : v2}) # 查询k1的值为v1,k2的值为v2,也就是关系型数据库中的AND
db.collectionName.find({$or: [{k1 : v1},{k2 : v2}]}) # 查询k1的值为v1,k2的值为v2的文档
db.collectionName.find({k:{$gt : v}}); # 查询k的值大于v的文档
db.collectionName.find({k:{$lt : v}}) # 查询k的值小于v的文档
db.collectionName.find({k:{$gt : v, $lt : v}}) # 查询k值大于v且小于v的值

MongoDB与RDBMS where 语句比较

操作 格式 范例 RDBMS 中的类似语句
等于 {<key>:<value>} db.love.find({“name”:”whoami”}).pretty() where name = ‘whoami’
小于 {<key>:{$lt:<value>}} db.love.find({“age”:{$lt:19}}).pretty() where age < 19
小于或等于 {<key>:{$lte:<value>}} db.love.find({“age”:{$lte:19}}).pretty() where likes <= 19
大于 {<key>:{$gt:<value>}} db.love.find({“age”:{$gt:19}}).pretty() where likes > 19
大于或等于 {<key>:{$gte:<value>}} db.love.find({“age”:{$gte:19}}).pretty() where likes >= 19
不等于 {<key>:{$ne:<value>}} db.love.find({“age”:{$ne:19}}).pretty() where likes != 19

MongoDB 官方文档地址:

https://www.mongodb.com/docs/manual/

菜鸟教程地址:

https://www.runoob.com/mongodb/mongodb-tutorial.html