MongoDB安装与基本操作

MongoDB

  • MongoDB是由10gen公司(现已改名为MongoDB Inc.)用C++语言研发的一款数据库,于2009年开源,MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的

  • MongoDB按照类似于JSON的格式存储数据,称作BSON (binary json),由成对的field和value构成,value除了数值和字符之外也可以包括数组([ ]),其他文档等
    img

    • 每一条数据称作一个文档(document)
    • 相对传统关系型数据库,文档之间可以有不一样的格式(字段field),因此更加灵活
    • 可以为数据创建索引,使用特定查询方式来分析统计数据
    • MongoDB开源免费,遵从GNU GPL协定
  • 下载地址
    官网下载地址

  • Mongodb术语与关系型数据库差异

    传统RDBMS(MySQL) MongoDB术语 说明
    DATABASE DATABASE 数据库
    TABLE COLLECTION 表/集合
    ROW DOCUMENT 行/文档
    COLUMN FIELD 列(字段)/ 字段(域)
    INDEX INDEX 索引
    TABLE JOIN 连接运算;MongoDB不支持集合间连接运算
    PRIMARY KEY PRIMARY KEY 主键,MongoDB默认使用_id field作为主键
    • 实验环境

      • centos7 192.168.10.40
      • 注:主机以关闭防火墙和selinux且可以连接外网
    • 修改yum源

      image-20191209162929527

      image-20191209163156242

      image-20191209163247695

    • 安装mondb

      image-20191209163429452

    • mongodb相关目录

      • 参数文件位置:/etc/mongod.conf
      • 数据文件位置:/var/lib/mongo
      • 默认日志文件位置:/var/log/mongodb/mongod.log
    • mongodb相关控制命令

      • 关闭服务:systemctl stop mongod

        image-20191209164027766

      • 启动服务:systemctl start mongod

        image-20191209164008929

      • 重启服务:systemctl restart mongod

        image-20191209164124750

    • 修改配置允许远程连接

      image-20191209163807974

      image-20191209163900682

      vi /etc/mongod.conf
      net:
        port: 27017
        bindIp: 0.0.0.0
      
    • 连接mongodb

      image-20191209164255061

      image-20191209164332512

  • mongodb常用管理命令

    • 查看存在的数据库

      image-20191209165358318

    • 查看存在的集合

      image-20191209191009092

      image-20191209191040002

    • 创建数据库和集合

      image-20191209170156563

      另一中创建集合的方法

      image-20191209185802624

      show dbs; #查看所有存在的数据库
      use newdb; #切换至newdb,该数据库不存在,插入集合后会自动创建
      db; #查看当前所在数据库
      db.tcollection.insertOne({x:1}); #创建集合并插入一条数据,隐式创建
      db.createCollection("C1") #创建集合c1,显示创建
      show collections; #查看当前数据库中的集合
      
    • 集合的删除

      image-20191209190753942

      db.c1.drop(); #删除集合
      show collections;
      
    • 删除数据库

      image-20191209191349094

      use newdb;
      db;
      db.dropDatabase(); #删除数据库
      show dbs;
      
  • mongodb常用操作命令

    • 插入文档

      image-20191209192503653

      >use db1;
      > db.createCollection("users"); #创建users集合
      > db.users.insertOne( #insertOne插入一个文档
      ... { 
      ... name:"zs", #文档中的字段
      ... age:26,
      ... status:"pending"
      ... }
      ... ); #分号可省略
      {
      	"acknowledged" : true, #创建是否成功,true或false
      	"insertedId" : ObjectId("5dee2dbaf3416e250ce4a88c") #自动生成的主键
      }
      
    • 插入多条记录

      image-20191209194447776

       db.users.insertMany([{name:"ls", age:29, status:"pending"},{name:"we", age:22, status:"pending"},{name:"mz", age:27, status:"pending"},{name:"na", age:25, status:"pending"}]);
      
      
    • 查询集合中所有文档

      image-20191209194644166

      db.users.find();
      
    • 查询集合中所有文档指定显示的字段

      image-20191209194714428

      db.users.find({},{name:1,age:1});
      
    • 查找其中年龄大于等于26的name

      image-20191209194756521

      db.users.find({age:{$gte:26}},{name:1,age:1});
      
      
    • 修改zs的年龄为27

      image-20191209194943091

      db.users.updateOne({name:"zs"},{$set:{age:27}});
      db.users.find({name:"zs"},{name:1,age:1});
      #$set 为字段赋值
      
      
    • 将所有人的status改为"rejected"

      image-20191209195646074

      db.users.updateMany({},{$set:{status:"rejected"}})
      db.users.find({},{status:1});
      
      
    	将年龄大于26的人的status改为"accepted"
    
    	![image-20191209195742519](https://img2018.cnblogs.com/blog/1241092/201912/1241092-20191209221617299-719527808.png)
    
    	```shell
    	db.users.updateMany({age:{$gt:26}},{$set:{status:"accepted"}})
    	db.users.find({},{age:1,status:1});
    
    
    • 删除年龄小于24的人

      image-20191209195905366

      db.users.find({},{age:1});
      
      
    • 删除user集合中所有的文档

      image-20191209200339560

      db.users.deleteMany({})
      db.users.find();
      
      
    • mongodb中的常用比较运算符

      运算符 说明
      $eq 等于指定值
      $gt 大于指定值
      $gte 大于等于指定值
      $in in 指定的数组的值列表中
      $lt 小于指定的值
      $lte 小于指定的值
      $ne 不等于指定的值
      $nin not in 指定的数组的值列表中
    • mongodb中的常用逻辑运算符

      运算符 说明
      $and 与运算符; { $and: [ { }, { } , ... ] }
      $not 非运算符;{ field: { $not: { } } }
      $or 或运算符;{ $or: [ { }, { }, ... ] }
    • 显示年龄在20到25之间(包含20和25)的文档

      image-20191209205057178

  • mongodb数据定义语言

    • 为users集合中的zs添加"gender" 字段,值为"female"

      image-20191209205625574

      db.users.updateOne({"name":"zs"},{$set:{"gender":"female"}})
      db.users.find()
      
      
    • 为所有不存在"gender"字段的文档添加该字段,默认为"";

      image-20191209210512877

       db.users.updateMany({gender:{$exists:false}},{$set:{gender:""}})
       db.users.find();
       #$exists 判断字段是否存在
       #$set 赋值
      
      
    • 设置mz和ls的gender为male

      image-20191209210832983

      db.users.updateMany({name:{$in:["ls","mz"]}},{$set:{gender:"male"}})
      db.users.find();
      #$in 在某个范围内
      
      
    • 将gender为空的文档删除gender字段

      image-20191209211156110

      db.users.updateMany({gender:{$eq:""}},{$unset:{gender:""}})
      db.users.find();
      #$unset 撤销赋值,删除该字段
      
      
  • 分组统计

    • 创建stu表并插入数据

      image-20191209213239428

    • 查找最高分

      image-20191209213608442

      db.stu.aggregate([{$match:{}},{$group:{_id:"",maxscore:{$max:"$score"}}}])
      #aggregate() 聚合函数
      #$match 过滤数据
      #$max 求最大值
      #其他常用函数
      #$project 修改输入文档的结构
      #$limit 用来限制MongoDB聚合管道返回的文档数
      #$skip 在聚合管道中跳过指定数量的文档,并返回余下的文档
      #$unwind 字段拆分
      #$group 分组
      #$sort 排序
      #$geoNear 输出接近某一地理位置的有序文档
      
      
    • 统计每个班级内的最高分

      image-20191209214746494

      db.stu.aggregate([{$match:{}},{$group:{_id:"$cno",maxscorce:{$max:"$score"}}}])
      #_id为0表示其cno为null,数值型强制转换为0
      
      
    • 统计每个班级内的最高分,不计算未分班的学生

      image-20191209215045162

      db.stu.aggregate([{$match:{cno:{$ne:0}}},{$group:{ _id:"$cno",maxscore:{$max:"$score"}}}])
      
      
    • 统计1班中男女生的人数

      image-20191209215347366

      db.stu.aggregate([{$match:{cno:1}},{$group:{_id:"$sex",cnt:{$sum:1}}}])
      
      
    • 统计每个班人数,按照分组列排序(不含未分班的学生)

      image-20191209215528060

      db.stu.aggregate([{$match:{cno:{$ne:0}}},{$group:{_id:"$cno",cnt:{$sum:1}}},{$sort:{_id:1}}])
      
      
    • 对班号进行去重操作

      image-20191209221212170

      db.stu.distinct("cno")
      
      
    • mongodb中的函数表达式

      表达式 描述
      $sum 计算总和
      $avg 计算平均值
      $min 获取集合中所有文档对应值得最小值
      $max 获取集合中所有文档对应值得最大值
      $push 在结果文档中插入值到一个数组中
      $addToSet 在结果文档中插入值到一个数组中,但不创建副本
      $first 根据资源文档的排序获取第一个文档数据
      $last 根据资源文档的排序获取最后一个文档数据
posted @ 2019-12-09 22:18  MirL  阅读(197)  评论(0编辑  收藏  举报