zoukankan      html  css  js  c++  java
  • MongoDB的入门

    MongoDB

    • mongodb是非关系型数据库

    • 对于关系型数据库,存储数据的时候需要提前建表建库,随着数据的复杂度越来越高,所建的表的数量也越来越多;但是非关系型却不需要

    mongodb的基本的命令的使用

    1. mongodb的数据库的命令

    • 查看当前的数据库:db

    • 查看所有的数据库:show dbs/databases

    • 切换数据库:use db_name

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

    2. mongodb的集合的命令

    • 不手动创建集合:向不存在的集合中第1次加数据时,集合会被创建出来

    • 手动的创建集合:

      • db.createCollection(name,options)这给是模型name是要创建的的集合的名字,options是条件

      • db.createCollection("stu")

      • db.createCollection("sub",{capped:true,size:10})

      • capped默认false表示不设置上限,true表示设置上限,size表示上限为10,超过10的部分会覆盖之前的内容

    • 查看集合:show collections

    • 删除集合:db.集合名字.drop()

    3. mongodb的增删改查

    • 以下的所有的stu是集合的名字

    • 增加之插入

      • 特点:不设置_id自动匹配
        db.stu.insert({name:"张三",age:18})
        db.stu.insert({_id:20191919,name:"张三",age:18})
    
    • 成功以后返回:WriteResult({ "nInserted" : 1 })
    • 查看结果:db.stu.find()
        { "_id" : ObjectId("5c8b87514e2832ea3f36c903"), "name" : "张三", "age" : 18 }
        { "_id" : 20191919, "name" : "张三", "age" : 18 }
    
    • 增加之保存
      • 特点:保存的数据已存在及_id相同,会覆盖之前的数据
        db.stu.save({_id:20191919,name:"二狗",age:22})
        结果:
        { "_id" : ObjectId("5c8b87514e2832ea3f36c903"), "name" : "张三", "age" : 18 }
        { "_id" : 20191919, "name" : "二狗", "age" : 22 }
    
    • 简单的查询:db.stu.find()
    • 更新
      • db.集合名称.update(<query> ,<update>,{multi: <boolean>})
      • query:查询条件,update:更新操作符(就是要改的内容),multi:可选, 默认是false,表示只更新一条,true的时候更新满足条件的所有的内容
    db.stu.update({name:'hr'},{name:'mnc'})   更新一条,覆盖式更新
    db.stu.update({name:'hr'},{$set:{name:'hys'}})    更新一条,只修改更新的那个
    db.stu.update({},{$set:{gender:0}},{multi:true})   更新全部,把所有gender的属性的gender的值改为0,无论有没有这个属性,没有的会添加这个属性
    
    • 删除

      db.集合名称.remove(<query>,{justOne: <boolean>})

      • query:可以写也可不写,不写的话要用{}表示,justOne:默认false表示删除满足条件的所有的内容,改为true或1表示只删除一个
      • db.stu.remove({})表示删除集合stu的所有的内容

    4. mongodb的查询的多花样

    • 4.1 返回的结果不同的查询
      • db.stu.find(条件) 简单的返回满足条件的内容
      • db.stu.findOne(条件) 简单的返回满足条件的一个内容
      • db.stu.find(条件).pretty 简单的返回满足条件的格式化的内容
    • 4.2 比较运算符
    db.stu.insert([{"name" : "郭靖", "hometown" : "蒙古", "age" : 20, "gender" : true },{"name" : "黄蓉", "hometown" : "桃花岛", "age" : 18, "gender" : false },{"name" : "华筝", "hometown" : "蒙古", "age" : 18, "gender" : false },{"name" : "黄药师", "hometown" : "桃花岛", "age" : 40, "gender" : true },{"name" : "段誉", "hometown" : "大理", "age" : 16, "gender" : true },{"name" : "段王爷", "hometown" : "大理", "age" : 45, "gender" : true },{"name" : "洪七公", "hometown" : "华夏", "age" : 18, "gender" : true }])
    
    • 等于: 默认是等于判断, 没有运算符
    • $lt:小于 $lt:小于等于 $gt:大于 $gte:大于等于 $ne:不等于
    • db.stu.find({age:{$gt:18}}) 大于18岁的人 $gt可以用所有的用算符
    • 4.3 逻辑用算符
      • and:在json中写多个条件即可: db.stu.find({age:{$gte:18},gender:true})
      • or :使用$or,值为数组,数组中每个元素为json:db.stu.find({$or:[{age:{$gt:18}},{gender:false}]})
      • and和or可以一起用:db.stu.find({$or:[{age:{$gte:18}},{gender:true}],name:'gj'})
    • 4.4 范围运算符
      • in :使用$in,$nin 判断数据是否在某个数组内:db.stu.find({age:{$in:[18,28,38]}}
    • 4.5 正则表达式
      • 使用//或$regex写正则表达式
        • db.stu.find({name:/^asdas/})
        • db.stu.find({name:{$regex:^asdas}})
    • 4.6 skip和limit(可以想成mysql中的limit的两个值,skip表示跳过n个,从第n+1个开始。limit表示取多少个,建议如果两个一起用可以先用skip再用limit)
      • skip单独使用:db.stu.find().skip(2)
      • limit单独使用:db.stu.find().limit(2)
      • 合用:db.stu.find().limit(2).skip(2)
    • 4.7 投影:在查询到的返回结果中,只选择必要的字段
      • db.集合名称.find({},{字段名称:1,...})
      • 参数为字段与值,值为1表示显示,值为0不显 特别注意:对于_id列默认是显示的,如果不显示需要明确设置为0
      • db.stu.find({},{_id:0,name:1})
    • 4.8 排序:sort()写在db.stu.find()后
      _ db.集合名称.find().sort({字段:1,...})
      _ 参数1为升序排列 参数-1为降序排列
      db.stu.find().sort({gender:-1,age:1})
    • 4.9 统计个数:count()
      • 条件写在find中:db.stu.find({gender:true}).count()
      • 条件写在count中:db.stu.count({gender:true})
    • 4.10 消除重复:distinct
      • db.集合名称.distinct('去重字段',{条件})
        db.stu.distinct('hometown',{age:{$gt:18}}))

    5. mongodb的聚合:

    • 聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。
    • db.集合名称.aggregate({管道:{表达式}})
    • 5.1 管道
      • 5.1.1 管道命令之$group
        • 特点:$group是所有聚合命令中用的最多的一个命令,用来将集合中的文档分组
          db.stu.aggregate({$group:{_id:"$gender",total:{$sum:1}}})
        • 其中注意点:
          • db.db_name.aggregate是语法,所有的管道命令都需要写在其中
          • _id 表示分组的依据,按照哪个字段进行分组,需要使用$gender表示选择这个字段进行分组
          • $sum:1 表示把每条数据作为1进行统计,统计的是该分组下面数据的条数
      • 5.1.2 group by null
        • 特点:当我们需要统计整个文档的时候,$group 的另一种用途就是把整个文档分为一组进行统计
          db.stu.aggregate({$group:{_id:null,total:{$sum:1}}})
        • _id:null 表示不指定分组的字段,即统计整个文档,此时获取的total表示整个文档的个数
      • 5.1.3 透视
        • 特点:使用$push后面跟"$name"显示所有的name,如果是"$$ROOT"显示说有的内容
         db.stu.aggregate({$group:{_id:null,name:{$push:"$name"}}})
         db.stu.aggregate({$group:{_id:null,name:{$push:"$$ROOT"}}})
        
      • 5.1.4 练习
        db.tv3.insert([{ "country" : "china", "province" : "sh", "userid" : "a" },{  "country" : "china", "province" : "sh", "userid" : "b" },{  "country" : "china", "province" : "sh", "userid" : "a" },{  "country" : "china", "province" : "sh", "userid" : "c" },{  "country" : "china", "province" : "bj", "userid" : "da" },{  "country" : "china", "province" : "bj", "userid" : "fa" }])
        
        • db.tv3.aggregate([ {$group:{_id:{country:"$country",province:"$province",userid:"$userid"}}}, {$group:{_id:{country:"$_id.country",province:"$_id.province"},total:{$sum:1}}} ])
      • 5.2 管道之$match
        • 特点:$match用于进行数据的过滤,是在能够在聚合操作中使用的命令,和find区别在于$match操作可以把结果交给下一个管道处理,而find不行
          db.stu.aggregate({$match:{age:{$gt:18}}}) 年龄大于18岁的人
          db.stu.aggregate([{$match:{age:{$gt:18}}},{$group:{_id:"$gender",total:{$sum:1}}}]) 年龄大于18的男女的人数
      • 5.3 管道之 $project
        • 特点:$project用于修改文档的输入输出结构,例如重命名,增加,删除字段
          db.stu.aggregate({$project:{_id:0,name:1,age:1}}) 输出name和age
          db.stu.aggregate([{$group:{_id:"$gender",counter:{$sum:1}}},{$project:{_id:0,counter:1}}]) 输出各个性别的人数
      • 5.4 管道之 $sort
        • 特点:$sort用于将输入的文档排序后输出
          db.stu.aggregate({$sort:{age:1}}) age升序
          db.stu.aggregate([{$group:{_id:"$gender",counter:{$sum:1}}},{$sort:{counter:-1}}]) gender分组,counter降序
      • 5.5 管道命令之$skip$limit
        • 特点:$limit限制返回数据的条数;$skip 跳过指定的文档数,并返回剩下的文档数;同时使用时先使用skip在使用limit
          db.stu.aggregate([{$skip:2},{$limit:2}]) 从第3个开始,返回3,4两个
          db.stu.aggregate([{$group:{_id:"$gender",counter:{$sum:1}}},{$sort:{counter:-1}},{$skip:1},{$limit:1}]) gender分组,counter降序,返回第二个
  • 相关阅读:
    JWT认证-插件准备
    drf 框架 三大组件
    drf框架 视图、工具视图、视图集
    drf框架 ModelSerializer
    CentOS6.5 上crontab每天自动备份mysql数据库
    php-GatewayWorker搭建实时聊天室
    Centos6.8实现SVN提交后自动更新目录
    Python在线聊天软件(Tkinter)
    Navicat for MySQL连接mysql数据库时提示错误:Can't connect to MySQL server (10060)
    Ubuntu16下apache2安装ssl阿里云证书
  • 原文地址:https://www.cnblogs.com/marchpy/p/10543960.html
Copyright © 2011-2022 走看看