MongoDB 的使用

一、什么是MongoDB

概念:MongoDB 是一个基于分布式文件存储的数据库。是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
目的:为web应用提供可扩展的高性能数据存储解决方案

二、MongoDB的安装

这里我使用docker来安装MongoDB

1. 拉取MongoDB镜像

dokcer pull mongo

默认会拉取最新的镜像
image.png

2. 创建MongoDB容器

docker run -dit --name mongo -p 27017:27017 mongo:latest --auth

参数说明

  • -i:表示运行容器
  • -t:表示容器启动后进入其命令行
  • -d:守护式方式创建容器在后台运行
  • -name:容器名称
  • -p 27017:27017:端口映射(宿主机端口:容器端口),mongoDB默认是27017端口
  • –auth:访问mongo需要鉴权(账号密码访问),这个参数要放在最后面,否则会报错

image.png

3. 进入容器并访问mongoDB

docker exec -it mongo /bin/mongosh

image.png

说明:
如果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用户,并赋予权限

  1. 创建账号
db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'test'},"readWriteAnyDatabase"]});

image.png

  1. 验证用户
db.auth("admin","123456")

image.png

  1. 使用账号密码登录数据库

先退出容器,因为之前直接进入命令行

docker exec -it mongo /bin/bash
mongosh -u admin -p 123456 

image.png

  1. 查看用户
#切换到admin
use admin
# 查看用户
show users

image.png

  1. 验证权限
show dbs

image.png
如果不是通过账号密码进入的mongoShell执该命令,则看不到数据库中的,因为没有权限
a0b4c9f0494945b97dc202e69c3c00e.png

四、MongoDB的常用命令

数据库

  1. 创建数据库

    use DATABASE_NAEM
    

    如果数据库不存在,则创建数据库,否则切换到指定的数据库中

image-20230331141005252

  1. 查看所有库

    show dbs
    

    image-20230331141122932

    如果我想要显示它,需要想runoob数据库中插入一些数据

    db.runoob.insert(
        {"name":"mongodb数据库",}
        )
    

    image-20230331141315801

注意:

MongoDB中默认的数据库为test,如果你没有创建新的数据库,集合将会存放在test数据库中

  1. 删除数据库

    db.dropDatabase()
    删除当前数据库
    

    可使用db命令查看当前数据库名称

    image-20230331141721459

集合

类似于mysql中的表格

  1. 创建集合

    语法:

    db.createCollection(name,options)
    参数说明:
    name:要创建的集合名称
    options:可选参数,指定有关内存大小,和索引的选项
    

​ options参数:
image-20230331142516811
image-20230331142424079

image-20230331143022218

  1. 查看集合

    show collections
    show tables
    这两种方式都可查看数据库中的集合
    
  2. 删除集合

    db.collection.drop()
    说明:
    collection:指的是集合名称
    返回值:
    如果成功删除集合,则drop()方法返回true,否则返回false
    

    删除mycol集合

image-20230331143337675

文档

插入文档

创建/插入操作会将新文档添加到集合中,如果该集合不存在,则插入操作将会创建该集合

  1. 向集合中插入一条文档数据

    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
)

image-20230331151433699

  1. 向集合中插入多条文档数据

    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
        )
    

    image-20230331153100570

    1. 查看集合中的文档

      db.runoob.find()
      

      image-20230331153229838

更新文档
  1. 更新一条

    db.collection.updateOne()
    
  2. 更新多条

    db.collection.updateMany()
    
  3. 替换一条

    db.collection.replaceOne()
    
删除文档

删除集合中的文档

# 方法1
db.collection.deleteMany()
# 方法2
db.collection.deleteOne()

删除status等于A的一个文档

image-20230331161934522

删除status等于D的全部文档

image-20230331161835545

查询文档

使用find()查询文档

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

语法:

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

查看inventory中的文档:db.inventory.find()

image-20230331163614197

结构化查询:

pretty():以格式化的方式显示所有文档

db.inventory.find().pretty()

image-20230331163702621

逻辑运算符
操作 格式
等于 {:}
小于 {:{$lt:}}
小于或等于 {:{$lte:}}
大于 {:{$gt:}}
大于或等于 {:{$gte:}}
不等于 {:{$ne:}}
# 查询status等于D的数据
db.inventory.find({"status":"D"}).pretty()
等价于:SELECT * FROM inventory WHERE status = "D"

image-20230331164400256

# 查询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"})

image-20230331170726230

OR

使用关键字$or

语法:
db.collection.find(
    {
        $or:[
            {key1:value1},{key2:value2}
        ]
    }
    )

查询status为D或者item为journal的数据

db.inventory.find( {$or:[ {"status":"D"}, {"item":"journal"} ]  }).pretty()

image-20230331172931399

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()

image-20230331173344378

limit()和skip()
  1. limit()方法

limit()方法指从MongoDB中读取指定数量的数据记录

语法:

db.collection.find().limit(number)
说明:
number:指定从MongoDB中读取记录的条数

比如:

db.inventory.find().limit(2)
#读取两条

image-20230402102339071

  1. skip()方法

skip()方法来跳过指定数量的数据

语法:

db.collection.find().limit(number).skip(number)
说明:
number:跳过的记录条数
排序

在mongoDB中使用sort()对数据排序;其中使用1和-1来指定排序的方式。

1:升序

-1:降序

语法:

db.collection_name.find().sort({key:1})

比如:按qty升序显示

image-20230402103044289

聚合

主要用于处理数据(例如:统计平均值,求和等),并返回计算后的数结构

类似于SQL语句中的count(*)

aggregate()方法

语法:

db.collection_name.aggregate()

image-20230402111427613

posted @ 2023-04-12 14:47  CCX330  阅读(85)  评论(0)    收藏  举报