MongoDB 的使用
一、什么是MongoDB
概念:MongoDB 是一个基于分布式文件存储的数据库。是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
目的:为web应用提供可扩展的高性能数据存储解决方案
二、MongoDB的安装
这里我使用docker来安装MongoDB
1. 拉取MongoDB镜像
dokcer pull mongo
默认会拉取最新的镜像
2. 创建MongoDB容器
docker run -dit --name mongo -p 27017:27017 mongo:latest --auth
参数说明
- -i:表示运行容器
- -t:表示容器启动后进入其命令行
- -d:守护式方式创建容器在后台运行
- -name:容器名称
- -p 27017:27017:端口映射(宿主机端口:容器端口),mongoDB默认是27017端口
- –auth:访问mongo需要鉴权(账号密码访问),这个参数要放在最后面,否则会报错
3. 进入容器并访问mongoDB
docker exec -it mongo /bin/mongosh
说明:
如果MongoDB6.0及以上使用:
docker exec -it mongo /bin/mongosh
如果是6.0以下的版本使用:
docker exec -it mongo /bin/mongo
因为Mongo6.0版本不会自带mongoshell 所以需要需要自己安装
三、创建MongoDB用户
1. mongo用户权限
read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除、查看统计或访问system.profile
dbOwner:允许用户在指定数据库中执行任意操作,增、删、改、查等
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin库中可用,赋予用户所有数据库的读权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库userAdmin权限
dbAdminAnyDatabase: 只在admin数据库中可用,赋予用户所有数据库dbAdmin权限
root:只在admin数据库中可用。超级管理员用户,超级权限
2. 创建用户
需求:创建一个test用户,并赋予权限
- 创建账号
db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'test'},"readWriteAnyDatabase"]});
- 验证用户
db.auth("admin","123456")
- 使用账号密码登录数据库
先退出容器,因为之前直接进入命令行
docker exec -it mongo /bin/bash
mongosh -u admin -p 123456
- 查看用户
#切换到admin
use admin
# 查看用户
show users
- 验证权限
show dbs
如果不是通过账号密码进入的mongoShell执该命令,则看不到数据库中的,因为没有权限
四、MongoDB的常用命令
数据库
-
创建数据库
use DATABASE_NAEM
如果数据库不存在,则创建数据库,否则切换到指定的数据库中
-
查看所有库
show dbs
如果我想要显示它,需要想
runoob
数据库中插入一些数据db.runoob.insert( {"name":"mongodb数据库",} )
注意:
MongoDB
中默认的数据库为test,如果你没有创建新的数据库,集合将会存放在test数据库中
-
删除数据库
db.dropDatabase() 删除当前数据库
可使用
db
命令查看当前数据库名称
集合
类似于mysql中的表格
-
创建集合
语法:
db.createCollection(name,options) 参数说明: name:要创建的集合名称 options:可选参数,指定有关内存大小,和索引的选项
options参数:
-
查看集合
show collections show tables 这两种方式都可查看数据库中的集合
-
删除集合
db.collection.drop() 说明: collection:指的是集合名称 返回值: 如果成功删除集合,则drop()方法返回true,否则返回false
删除
mycol
集合
文档
插入文档
创建/插入操作会将新文档添加到集合中,如果该集合不存在,则插入操作将会创建该集合
-
向集合中插入一条文档数据
db.collection.insertOne( <document>, { writeConcern: <document> } ) 说明: document:要插入集合中的文档 writeConcern:可选;写入策略,默认为1,即要求确认写操作,0是不要求
向runoob中插入一条数据
document={"dep_id":"T23001","dep_name":"信息管理学院","master_name":"艾娥儿","slogan":"hahahh"}
db.runoob.insertOne(document
)
-
向集合中插入多条文档数据
db.collection.insertMany()
document= [{"site":"www.baidu.com"}, {"site":"www.google.com","name":"Google"}, {"site":"www.runoob.com","name":"菜鸟教程","num":5}] db.runoob.insertMany( document )
-
查看集合中的文档
db.runoob.find()
-
更新文档
-
更新一条
db.collection.updateOne()
-
更新多条
db.collection.updateMany()
-
替换一条
db.collection.replaceOne()
删除文档
删除集合中的文档
# 方法1
db.collection.deleteMany()
# 方法2
db.collection.deleteOne()
删除status等于A的一个文档
删除status等于D的全部文档
查询文档
使用find()
查询文档
find()
方法以非结构化的方式显示所有文档
语法:
db.collection.find(query,projection)
说明:
query:可选,使用查询操作符查询执行的条件
projection:使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
查看inventory中的文档:db.inventory.find()
结构化查询:
pretty()
:以格式化的方式显示所有文档
db.inventory.find().pretty()
逻辑运算符
操作 | 格式 |
---|---|
等于 | { |
小于 | { |
小于或等于 | { |
大于 | { |
大于或等于 | { |
不等于 | { |
# 查询status等于D的数据
db.inventory.find({"status":"D"}).pretty()
等价于:SELECT * FROM inventory WHERE status = "D"
# 查询qty小于75
db.inventory.find({"qty":{$lt:75}}).pretty()
查询qty小于等于75
db.inventory.find({"qty":{$lte:75}}).pretty()
查询qty大于75
db.inventory.find({"qty":{gt:75}}).pretty()
查询qty小于等于75
db.inventory.find({"qty":{$gte:75}}).pretty()
查询qty不等于75
db.inventory.find({"qty":{$ne:75}}).pretty()
条件运算
AND
db.collection.find({key1:value1,key2:value2}).pretty()
查看status为A,且item是“journal''的数据
db.inventory.find({"status":"A","item":"journal"})
OR
使用关键字$or
语法:
db.collection.find(
{
$or:[
{key1:value1},{key2:value2}
]
}
)
查询status为D或者item为journal的数据
db.inventory.find( {$or:[ {"status":"D"}, {"item":"journal"} ] }).pretty()
AND和OR的使用
类似于where qty<=75 and (status="D"OR item="journal")
查询status为D或者item为journal,且qty<=75的数据
db.inventory.find( {"qty":{$lte:75},
$or:[ {"status":"D"}, {"item":"journal"} ] }).pretty()
limit()和skip()
- limit()方法
limit()方法指从MongoDB中读取指定数量的数据记录
语法:
db.collection.find().limit(number)
说明:
number:指定从MongoDB中读取记录的条数
比如:
db.inventory.find().limit(2)
#读取两条
- skip()方法
skip()方法来跳过指定数量的数据
语法:
db.collection.find().limit(number).skip(number)
说明:
number:跳过的记录条数
排序
在mongoDB中使用sort()
对数据排序;其中使用1和-1来指定排序的方式。
1:升序
-1:降序
语法:
db.collection_name.find().sort({key:1})
比如:按qty升序显示
聚合
主要用于处理数据(例如:统计平均值,求和等),并返回计算后的数结构
类似于SQL语句中的count(*)
aggregate()方法
语法:
db.collection_name.aggregate()