1.MongDB的简介:

  • MongoDB是一个开源、高性能、无模式的文档型数据库
  • 当初的设计就是用于简化开发和方便扩展,是NoSQL数据库产品中的一种。是最像关系型数据库(MySQL)的非关系型数据库
  • 它支持的数据结构非常松散,是一种类似于 JSON 的 格式叫BSON,所以它既可以存储比较复杂的数据类型,又相当的灵活。
  • MongoDB中的记录是一个文档,它是一个由字段和值对(fifield:value)组成的数据结构。MongoDB文档类似于JSON对象,即一个文档认为就是一个对象。字段的数据类型是字符型,它的值除了使用基本的一些类型外,还可以包括其他文档、普通数组和文档数组。

2.MongDB的相关概念:

  • MongoDB可应对三高需求:
    • High performance - 对数据库高并发读写的需求
    • Huge Storage - 对海量数据的高效率存储和访问的需求
    • High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求

3.MongDB的体系结构:

  • mysql与MongDB对比

    image-20230223212212941

4.MongDB的数据模型:

  • MongoDB的最小存储单位就是文档(document)对象。文档(document)对象对应于关系型数据库的行。数据在MongoDB中以

    BSON(Binary-JSON)文档的格式存储在磁盘上。

  • BSON(Binary Serialized Document Format)是一种类json的一种二进制形式的存储格式,简称Binary JSON。BSON和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinData类型。

  • BSON采用了类似于 C 语言结构体的名称、对表示方法,支持内嵌的文档对象和数组对象,具有轻量性、可遍历性、高效性的三个特点,可以有效描述非结构化数据和结构化数据。这种格式的优点是灵活性高,但它的缺点是空间利用率不是很理想。

5.MongDB的特点:

  • 高性能:
  • 高可用性:
  • 高扩展性:
  • 丰富的查询支持:

6.安装与配置:

1.yum安装:

  • 配置yum仓库:

    image-20230223204743691
    1
    2
    3
    4
    [mongodb]
    name=mongo
    baseurl=https://mirrors.aliyun.com/mongodb/yum/redhat/8Server/mongodb-org/4.4/x86_64/
    gpgcheck=0
  • 安装:

    1
    yum install -y mongodb-org
  • 配置资源限制:

    1
    2
    3
    4
    # 配置资源限制
    [root@kittod ~]# vim /etc/security/limits.conf
    * soft nofile 65536
    * hard nofile 65536
    1
    2
    3
    4
    5
    6
    7
    # 默认情况下 MongoDB运行使用 mongod用户和下面的默认目录
    # 这种安装方式将创建默认目录,并将这些目录的所有者和组设置为 mongod。
    [root@quruixiang yum.repos.d]# ll /var/lib/mongo/
    total 0
    [root@quruixiang yum.repos.d]# ll /var/log/mongodb
    total 0
    -rw-r----- 1 mongod mongod 0 Sep 29 05:53 mongod.log
  • 重启MongoDB:

    1
    systemctl restart mongod
  • 连接MongoDB

    1
    mongo --host=127.0.0.1 --port=27017

2.docker安装:

  • 创建mongdb目录并打开它:

    1
    mkdir ~/mongdb & cd ~/mongodb
  • 方式一:无账号密码,不需要认证的安装:

    1
    2
    3
    4
    5
    docker run -d --name mongodb --restart always --privileged -p 27017:27017 \
    -v $PWD/data:/data/db mongo:4.2.2
    # 参数:
    # --privileged 拥有真正的root权限
    # --restart=always Docker服务重启容器也启动
    1
    docker exec -it mongodb /bin/bash
    1
    mongo
  • 方式二:有账号密码,需要认证的安装:

    1
    2
    3
    4
    5
    6
    7
    8
    docker run -d --name mongodb --restart always --privileged -p 27017:27017 -v $PWD/data:/data/db \
    -e MONGO_INITDB_ROOT_USERNAME=admin \
    -e MONGO_INITDB_ROOT_PASSWORD=123456 \
    mongo:4.2.2 mongod --auth
    # 参数:
    # -e MONGO_INITDB_ROOT_USERNAME=admin 指定用户名
    # -e MONGO_INITDB_ROOT_PASSWORD=123456 指定密码
    # mongod --auth :容器默认启动命令是mongod,我们认证需要修改启动命为mongod --auth开启认证
    1
    docker exec -it mongodb /bin/bash
    1
    mongo --host=127.0.0.1 --port 27017 -u admin -p 123456 --authenticationDatabase admin

7.数据库增删改查:

  • 描述:

    • 一个 mongodb 中可以建立多个数据库。 MongoDB 的默认数据库为”db”
    • 该数据库存储在 data 目录中
    • MongoDB 的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限, 不同的数据库也放置在不同的文件中
  • 创建数据库和使用数据库:(新创建的数据库不会显示到数据库列表,除非数据库中有数据)

    1
    use [数据库名]
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 命名规范:
    # 不能是空字符串("")
    # 不得含有' '(空格)、.、$、/、\和\0 (空字符)
    # 应全部小写
    # 最多 64 字节
    # admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个 数据库,这个用户
    # 自动继承所有数据库的权限。一些特定的服务器端命令也只 能从这个数据库运行,比如列出所有
    # 的数据库或者关闭服务器
    # local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集 合
    # config: 当 Mongo 用于分片设置时,config 数据库在内部使用,用于保存分片 的相关信息
  • 查看所有数据库:

    1
    show dbs
  • 查看当前正在使用的数据库:

    1
    db
  • 删除数据库:(先使用数据库)

    1
    db.dropDatabase()

8.集合(表)增删改查:

  • 描述:

    • 文档是一组键值(key-value)对(即 BSON)
    • MongoDB 的文档不需要设置相同的字段, 并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别
  • 创建集合:当向一个集合中插入一个文档的时候,如果集合不存在,则会自动创建集合

    1
    2
    3
    db.createCollection(name)
    例:
    db.createCollection("mycollection")
  • 查询当前库中的j集合:

    1
    show collections
  • 集合的删除:

    1
    2
    3
    db.集合.drop()
    例:
    db.book.drop()

9.文档(行)增删改查:

1.新增数据:

1
2
3
4
5
6
7
8
9
db.集合名称.insert(文档)
db.集合名称.insertOne(文档) # 向集合插入一个新文档
db.集合名称.insertMany(文档) # 向集合插入一个多个文档
例:
db.book.insertOne({name:"springboot",type:"springboot"})
# 参数:
# document:要写入的文档。
# writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求。
# ordered:指定是否按顺序写入,默认 true,按顺序写入。

2.修改数据:

  • 修改满足条件的一条数据:(遇到数据修改后结束)

    1
    2
    3
    db.集合名称.update(条件,{操作种类:{文档}})
    例:
    db.book.update({name:"springboot"},{$set:{name:"springboot2"}})
  • 修改满足条件的一条数据:(让数值加一)

    1
    2
    3
    db.集合名称.update(条件,{操作种类:{文档}})
    例:
    db.book.update({name:"spring"},{$inc:{count:NumberInt(1)}})
  • 修改满足条件的多条数据:

    1
    2
    3
    db.集合名称.update(条件,{操作种类:{文档}},{multi:true})
    例:
    db.book.update({name:"springboot"},{$set:{name:"springboot2"}},{multi:true})

3.查看数据:

  • 基础查询:

    • 查询全部:

      1
      db.集合.find({})
    • 查询第一条:

      1
      2
      3
      db.集合.findOne({文档})
      例:
      db.book.findone({name:"spring"})
    • 查询指定数量文档:

      1
      db.集合.find({文档}).limit(10)
    • 跳过指定数量文档:

      1
      db.集合.find({文档}).skip(20)
    • 统计:

      1
      db.集合.count()
    • 按条件排序:

      1
      2
      3
      db.集合名称.find().sort(排序方式)
      例:
      db.comment.find().sort({userid:-1,likenum:1})
    • 投影:

      1
      db.集合名称.find(条件,{文档})
  • 高级查询:

    • 模糊查询:

      1
      2
      3
      4
      db.集合.find({域名:/正则表达式/})
      例:
      db.comment.find({content:/开水/}) //包含“开水”的所有文档
      db.comment.find({content:/^专家/}) //以“专家”开头的的文档
    • 条件比较运算:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      db.集合.find({字段:{关键词:值}})
      关键词:
      大于:$gt
      小于: $lt
      大于等于: $gte
      小于等于: $lte
      不等于:$ne
      例:
      db.comment.find({likenum:{$gt:NumberInt(700)}})
    • 比较连接查询:

      1
      2
      3
      4
      5
      6
      7
      db.集合.find(连接词:[{字段:{关键词:值}},{...}])
      连接词:
      和:$and
      或:$or
      例:
      db.comment.find({$and:[{likenum:{$gte:NumberInt(700)}},{likenum:{$lt:NumberInt(2000)}}]}) //大于等于700 并且小于2000的文档
      db.comment.find({$or:[ {userid:"1003"} ,{likenum:{$lt:1000} }]}) //userid为1003,或者点赞数小于1000的文档
    • 包含查询:(等同于SQL中的in)

      1
      2
      3
      4
      5
      6
      7
      db.集合.find({域名:{关键词:[值1,值2]}})
      关键词:
      包含:$in
      不包含:$nin
      例:
      db.comment.find({userid:{$in:["1003","1004"]}}) //字段包含1003或1004的文档
      db.comment.find({userid:{$nin:["1003","1004"]}}) //不包含1003和1004的文档

4.删除数据:

1
2
3
db.集合名称.remove(条件)
例:
db.book.remove({type:"springboot"})

10.索引操作:

  • 索引的查看:

    1
    2
    3
    db.collection.getIndexes()
    例:

  • 索引的创建:

    1
    2
    3
    db.collection.createIndex(keys, options)
    例:

  • 索引的移除:

    1