MongoDB 教程

  • 业务应用场景

    “三高” 需求
    高并发读写
    高效率存储和访问
    对数据库的高扩展性和高应用性的需求

    具体应用场景
    社交(用户信息、朋友圈信息、附近人和地点)
    游戏 (游戏用户信息、用户装备和积分)
    物流(存储订单信息、订单状态)
    视频直播(用户信息、点赞互动)

    特点:数据量大、写入操作频繁、价值较低(对事务性要求不高)

  • 简介

    MongoDB是一个开源、高性能、无模式的文档型数据库,当初的设计就是用于简化开发和方便扩展,是NoSQL数据库产品中的一种。是最像关系型数据库(MySQL)的非关系型数据库。

    MongoDB支持的数据结构非常松散,是一种类似于 JSON 的格式叫 BSON,所以它既可以存储比较复杂的数据类型,又相当的灵活。

    MongoDB中的记录是一个文档,它是一个由字段和值对(field:value)组成的数据结构。MongoDB文档类似于 JSON 对象,即一个文档认为就是一个对象。字段的数据类型是字符型,它的值除了使用基本的一些类型外,还可以包括其他文档、普通数组和文档数组。

  • 与mysql的对比
    在这里插入图片描述
    在这里插入图片描述

  • 数据类型
    在这里插入图片描述
    提示:shell默认使用64位浮点型数值。{“x”:3.14}或{“x”:3}。对于整型值,可以使NumberInt(4字节符号整数)或NumberLong(8字节符号整数),{“x”:NumberInt(“3”)}{“x”:NumberLong(“3”)}

  • 启动 MongoDB

    • 方式一:
      新建 data 文件
      在这里插入图片描述
      data文件夹下新建db文件夹 作为存放数据库文件的位置
      打开 bin 目录 敲定 cmd 打开命令行窗口
      敲定命令 mongod --dbpath=…\data\db在这里插入图片描述
      在这里插入图片描述

    • 方式二:

      新建 conf 文件夹
      在这里插入图片描述
      再建 mongod.conf 文件
      内容在这里插入图片描述
      ctrl + c 结束命令行

    输入命令 :
    mongod -f …/conf/mongod.conf

    mongod --conf …/config/mongod.conf

  • shell 连接
    打开 bin 目录 敲定 cmd 新建一个命令行窗口 输入:
    mongo

    mongo --host=127.0.0.1 --port=27017
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    查看已经有的数据库:
    show databases(dbs)

    退出mongodb:
    exit

    更多参数可以通过帮助查看:
    mongo --help

    提示:
    MongoDB javascript shell是一个基于javascript的解释器,故是支持js程序的

  • compass 图形化界面

    mongodb-compass 解压缩 在这里插入图片描述
    点击使用即可在这里插入图片描述

  • 需求
    创建一个数据库名 article
    在这里插入图片描述

  • 基本命令 —— 数据库创建删除

    选择和创建数据库的语法格式:
    use 数据库名称

    如果数据库不存在则自动创建,例如,以下语句创建
    use article

    查看有权限查看的所有的数据库命令
    show dbs 或 show databases

    注意: 在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。

    查看当前正在使用的数据库命令
    db

    MongoDB 中默认的数据库为 test,如果你没有选择数据库,集合将存放在 test 数据库中。
    在这里插入图片描述
    当article不为空有集合时,会自动实例化到磁盘

    删除数据库
    db.dropDatabase()
    在这里插入图片描述

  • mongodb 三个特殊数据库

    admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。

    local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合。

    config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。

  • 集合

    基本语法格式:(显示创建)
    db.createCollection(name)

    查看当前库中的表:show collections命令

    集合删除语法格式如下:
    db.collection.drop()

    db.集合.drop()
    在这里插入图片描述

  • CRUD

    • 单个文档插入
      使用insert() 或 save() 方法向集合中插入文档,语法如下:

      db.collection.insert(
      <document or array of documents>,
      {
      writeConcern: <document>,
      ordered: <boolean>
      }
      )
      

      在这里插入图片描述
      查询 插入成功
      在这里插入图片描述
      查询当前库中的表 说明隐式创建成功
      在这里插入图片描述
      提示:
      1)comment集合如果不存在,则会隐式创建
      2)mongo中的数字,默认情况下是double类型,如果要存整型,必须使用函数NumberInt(整型数字),否则取出来就有问题了。
      3)插入当前日期使用 new Date()
      4)插入的数据没有指定 _id ,会自动生成主键值
      5)如果某字段没值,可以赋值为null,或不写该字段。

    • 批量插入

      db.collection.insertMany(
      [ <document 1> , <document 2>, ... ],
      {
      writeConcern: <document>,
      ordered: <boolean>
      }
      )
      

      在这里插入图片描述
      提示:
      插入时指定了 _id ,则主键就是该值。
      如果某条数据插入失败,将会终止插入,但已经插入成功的数据不会回滚掉。
      因为批量插入由于数据较多容易出现失败,因此,可以使用try catch进行异常捕捉处理,测试的时候可以不处理。如(了解):

      try {
          db.comment.insertMany([
                 ~ 
                  
           ]);
      } catch (e) {
          print (e);
      }
      
    • 查询

      db.collection.find(, [projection]) 在这里插入图片描述

    • 投影查询
      如果要查询结果返回部分字段,则需要使用投影查询(不显示所有字段,只显示指定的字段)。
      如:查询结果只显示 _id、userid、nickname :
      在这里插入图片描述
      默认 _id 会显示。
      如:查询结果只显示 userid、nickname ,不显示 _id :
      在这里插入图片描述
      再例如:查询所有数据,但只显示 _id、userid、nickname : 在这里插入图片描述

    • 修改
      db.collection.update(query, update, options)

      • 赋值修改
        db.comment.update({_id:“1”},{likenum:NumberInt(1001)})
        在这里插入图片描述
      • 局部修改
        db.comment.update({_id:“2”},{$set:{likenum:NumberInt(889)}}) 在这里插入图片描述
      • 批量修改
        //默认只修改第一条数据
        db.comment.update({userid:“1003”},{KaTeX parse error: Expected 'EOF', got '}' at position 21: …nickname:"凯撒2"}}̲) //修改所有符合条件的…set:{nickname:“凯撒大帝”}},{multi:true})
        在这里插入图片描述
      • 列值增长的修改
        db.comment.update({_id:“3”},{$inc:{likenum:NumberInt(1)}})在这里插入图片描述
    • 删除
      删除文档的语法结构:
      db.集合名称.remove(条件)

      以下语句可以将数据全部删除,请慎用
      db.comment.remove({}) 在这里插入图片描述
      如果删除_id=1的记录,输入以下语句
      db.comment.remove({_id:“1”})
      在这里插入图片描述

  • 文档分页查询

    • 统计查询
      db.collection.count(query, options)
      在这里插入图片描述

    • 分页列表查询
      db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

      如果你想返回指定条数的记录,可以在find方法后调用limit来返回结果(TopN),默认值20,例如:
      db.comment.find().limit(3)

      skip方法同样接受一个数字参数作为跳过的记录条数。(前N个不要),默认值是0
      db.comment.find().skip(3) 在这里插入图片描述
      分页查询:需求:每页2个,第二页开始:跳过前两条数据,接着值显示3和4条数据
      //第一页
      db.comment.find().skip(0).limit(2)
      //第二页
      db.comment.find().skip(2).limit(2)
      //第三页
      db.comment.find().skip(4).limit(2) 在这里插入图片描述

    • 排序查询

      db.集合名称.find().sort(排序方式)
      在这里插入图片描述

  • 正则的复杂条件查询
    MongoDB的模糊查询是通过正则表达式的方式实现的。格式为:
    db.collection.find({field:/正则表达式/})

    提示:正则表达式是js的语法,直接量的写法。
    db.comment.find({content:/天气/})

    例如,我要查询评论内容包含“因为”的所有文档,代码如下:
    db.comment.find({content:/^因为/})
    在这里插入图片描述

  • 比较查询
    <, <=, >, >= 这个操作符也是很常用的,格式如下:

    db.集合名称.find({ "field" : { $gt: value }}) // 大于: field > value
    db.集合名称.find({ "field" : { $lt: value }}) // 小于: field < value
    db.集合名称.find({ "field" : { $gte: value }}) // 大于等于: field >= value
    db.集合名称.find({ "field" : { $lte: value }}) // 小于等于: field <= value
    db.集合名称.find({ "field" : { $ne: value }}) // 不等于: field != value
    

    示例:查询评论点赞数量大于700的记录 db.comment.find({likenum:{$gt:NumberInt(700)}})
    在这里插入图片描述

  • 包含查询
    包含使用$in操作符。 示例:查询评论的集合中userid字段包含1003或1004的文档
    db.comment.find({userid:{$in:[“1003”,“1004”]}})

    不包含使用$nin操作符。 示例:查询评论集合中userid字段不包含1003和1004的文档
    db.comment.find({userid:{$nin:[“1003”,“1004”]}})
    在这里插入图片描述

  • 条件连接查询
    我们如果需要查询同时满足两个以上条件,需要使用$and操作符将条件进行关联。(相 当于SQL的and) 格式为:
    $and:[ { },{ },{ } ]

    示例:查询评论集合中likenum大于等于700 并且小于2000的文档:

    db.comment.find({$and:[{likenum:{$gte:NumberInt(700)}},{likenum:{$lt:NumberInt(2000)}}]})
    

    如果两个以上条件之间是或者的关系,我们使用 操作符进行关联,与前面 and的使用方式相同 格式为:
    $or:[ { },{ },{ } ]

    示例:查询评论集合中userid为1003,或者点赞数小于1000的文档记录

    db.comment.find({$or:[ {userid:"1003"} ,{likenum:{$lt:1000} }]})
    

    在这里插入图片描述

  • 常用命令小结

    选择切换数据库:use articledb
    插入数据:db.comment.insert({bson数据})
    查询所有数据:db.comment.find();
    条件查询数据:db.comment.find({条件})
    查询符合条件的第一条记录:db.comment.findOne({条件})
    查询符合条件的前几条记录:db.comment.find({条件}).limit(条数)
    查询符合条件的跳过的记录:db.comment.find({条件}).skip(条数)
    修改数据:db.comment.update({条件},{修改后的数据}) 或db.comment.update({条件},{$set:{要修改部分的字段:数据})
    修改数据并自增某字段值:db.comment.update({条件},{$inc:{自增的字段:步进值}})
    删除数据:db.comment.remove({条件})
    统计查询:db.comment.count({条件})
    模糊查询:db.comment.find({字段名:/正则表达式/})
    条件比较运算:db.comment.find({字段名:{$gt:值}})
    包含查询:db.comment.find({字段名:{$in:[值1,值2]}})或db.comment.find({字段名:{$nin:[值1,值2]}})
    条件连接查询:db.comment.find({$and:[{条件1},{条件2}]})或db.comment.find({$or:[{条件1},{条件2}]})
    
  • 查看索引
    db.collection.getIndexes()
    在这里插入图片描述
    结果中显示的是默认 _id 索引。

    默认_id索引:
    MongoDB在创建集合的过程中,在 _id 字段上创建一个唯一的索引,默认名字为 id ,该索引可防止客户端插入两个具有相同值的文档,您不能在_id字段上删除此索引。

    注意:该索引是唯一索引,因此值不能重复,即 _id 值不能重复的。在分片集群中,通常使用 _id 作为片键。

  • 索引的创建
    db.collection.createIndex(keys, options)

    单字段索引示例:对 userid 字段建立索引:
    db.comment.createIndex({userid:1})

    复合索引:对 userid 和 nickname 同时建立复合(Compound)索引:
    在这里插入图片描述

  • 索引的移除
    db.collection.dropIndex(index)
    在这里插入图片描述
    提示: _id 的字段的索引是无法删除的,只能删除非 _id 字段的索引。

  • 索引的使用
    使用执行计划(解释计划、Explain Plan)来查看查询的情况
    db.collection.find(query,options).explain(options
    在这里插入图片描述
    compass下查看
    在这里插入图片描述
    覆盖查询
    当查询条件和查询的投影仅包含索引字段时,MongoDB直接从索引返回结果,而不扫描任何文档或将文档带入内存。 这些覆盖的查询可以非常有效。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值