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降序,返回第二个
原文地址:https://www.cnblogs.com/marchpy/p/10543960.html