zoukankan      html  css  js  c++  java
  • mongodb基本指令与高级查询指令以及聚合命令

    一、MongoDB中关于database的基本指令

     1 ###关于database的基本指令
     2 #查询当前使用的数据库指令
     3 db
     4 
     5 #查询所有的数据库指令
     6 show dbs#或者:show databases
     7 
     8 #切换数据库指令
     9 use db_name
    10 
    11 #删除当前数据库指令
    12 db.dropDatabase()

    二、MongoDB中关于集合的创建及基本增删改查指令

    1、集合创建(集合相当于mysql里的表)

     1 ###不手动创建集合
     2 #向不存在的集合中第一次加入数据时,集合会被创建出来
     3  
     4 ###手动创建集合
     5 db.createCollection(name,options)
     6  
     7 #例如创建集合test
     8 db.createCollection(test)
     9  
    10 db.createCollection(test,{capped:true,size:10})
    11  #参数capped:默认值为false表示不设置上限,值为true表示设置上限;参数size:当capped值为true时,需要指定此参数,表示上限大小,当文档达到上限时,会将之前的数据覆盖,单位为字节
    12 
    13 #查看集合
    14 show collections
    15 
    16 #删除集合
    17 db.collection_name.drop()

    2.集合中的数据类型

      1、Object ID :文档ID

      2、String:字符串,最常用,必须是有效的UTF-8  

      3、Boolean:存储一个布尔值,True或false

      4、integer:整数可以是32位或64位,取决于服务器

      5、Double:存储浮点值

      6、Arrays:数据或列表,多个值存储到一个键

      7、Object:用于嵌入式的文档,即一个值为一个文档

      8、Null:存储Null值

      9、Timestamp:时间戳,表示从1970-1-1到现在的总秒数

      10、Date:存储当前日期或时间的UNIX时间格式

      注:每个文档都有一个属性,为_id,保证每个文档的唯一性,

        可以自己去设置_id插入文档,如果没有提供,那么MongoDB为每个文档提供了一个独特的_id,类型为Object ID

        Object ID是一个12字节的十六进制数:

            前4个字节为当前时间戳

            接下来3个字节为机器ID

            接下来的2个字节为MongoDB的服务器进程id

            最后3个字节为简单的增量值

        创建日期语句如下:参数的格式为YYYY-MM-DD,具体指令为:

    new Date("2017-12-20")

    3、插入数据

    插入文档时,如果不指定_id参数,MongoDB会为文档分配一个唯一的Objectid

    1 db.collection_name.insert(document)
    2 
    3 db.test.insert({name:"gi",gender:1})#向test集合插入数据{name:"gi",gender:1}
    4 
    5 db.test.insert({_id:"20181125",name:"gi",gender:1})#向test集合插入数据{_id:"20181125"name:"gi",gender:1}
    1 ###Mong0DB插入数据
    2 db.collection.insert({})#插入数据,“_id”存在就报错
    3 db.collection.save({})#插入数据,如果文档的“_id”存在就会更新数据,如果文档的“_id”不存在则添加数据

    4、删除数据

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

      参数query:可选,删除的文档的条件

      参数justOne:可选,如果设为True或1,则只删除一条,默认false,表示删除多条

    1 ###MongDB删除数据
    2 db.test.remove({name:"xiaowang"},{justOne:true})
    3 #默认情况会删除所有满足条件的数据,{justOne:true}能达到只删除一条的效果 

    5、更新数据

    指令:db.集合名称。update(<query>,<update>,{multi:<boolean>})

      参数query:查询条件

      参数update:更新操作符

      参数multi:可选,默认是false,表示只更新找到的第一条记录,值为True表示把所有满足条件的文档全部更新。

    注意:“multi update only works with $ operators”(multi 只和$一起使用)

    1 ###MongoDB更新数据
    2 db.test.update({name:"xiaoming"},{name:"xiaozhang"})
    3 #把名字为xiaoming的数据替换为{name:"xiaozhang"},注意此时是整条数据被替换成{name:"xiaozhang"}
    4 
    5 db.test.update({name:"xiaoming"},{$set:{name:"xiaozhang"}})
    6 #把name为xiaoming的数据name值更新为xiaozhang,注意此时只是这条数据的name被更新了,其他不变,且只更新数据集中的符合条件的第一条数据
    7 
    8 db.test.update({name:"xiaoming"},{$set:{name:"xiaozhang"}},{multi:true})
    9 #{multi:true}可以达到更新多条数据的目的

    6、查询数据

      1、方法find():查询

          db.集合名称.find({条件文档})

      2、方法findOne():查询,只返回第一个

          db.集合名称.findOne({条件文档})

      3、方法pretty():将结果格式化

          db.集合名称.find({条件文档}).pretty()

    7、高级查询

      1、比较运算符

        等于:默认是等于判断,没有运算符

        小于:$it    (less than)

        小于等于:$ite   (less than equal)

        大于:$gt   (greater than)

        大于等于:$gte     (greater than equal)

        不等于:$ne

    db.test.find({age:{$gte:18}}) #test中年龄大于等于18的记录

      2.范围运算符

        使用“$in”,"$nin"判断是否在某个范围内

    db.test.find({age:{$in:[18,28,38]}}) #查询年龄为18,28,28的test中的记录

      3、逻辑运算符

        and:在json中写多个条件即可

    db.test.find({age:{$gte:18},gender:true}) #查询年龄大于或等于18,并且性别为true的学生

        or:使用$or,值为数组,数组中每个元素为json

    db.test.find({$or:[{age:{$gt:18}},{gender:false}]}) #查询年龄大于18,或性别为false的学生
    db.test.find({$or:[{age:{$gte:18}},{gender:true}],name:"gi"}) #查询年龄大于18或性别为男生,并且姓名为“gi”

      4、正则表达式

        使用//或$regex编写正则表达式

    db.test.find({sku:/^abc/}) #sku标签中以abc开头的记录
    
    db.test.find({sku:{$regex:"789$"}}) #sku标签中以789$结尾的记录

      5、limit和skip

        方法limit():用于读取指定数量的文档

          db.集合名称.find().limit(NUMBER)

    db.test.find().limit(2) #查询test集合中的前两条记录

        方法skip():用于跳过指定数量的文档

          db.集合名称.find().skip(NUMBER)

    db.test.find().skip(2) #跳过test集合中的前两条数据,

        同时使用skip和limit(可实现翻页功能)(一般先使用skip,再使用limit,这样效率高)

    db.test.find().skip(2).limit(2)
    
    
    db.test.find().limit(3).skip(2)

      6、自定义查询

        使用$where后面写一个函数,返回满足条件的数据

    #查询年龄大于30 的学生
    db.test.find({$where:function(){return this.age>30;}})

      7、投影

        在查询到的返回结果中,只选择必要的字段

          db.集合名称。find({},{字段名称:1,...})

        参数为字段与值,值为1表示显示,值为0表示不显示

        特殊:对于_id列默认是显示的,如果不显示需要明确设置为0

    #test输出只显示name列和gender列
    db.test.find({},{_id:0,name:1,gender:1})

      8、排序

        方法sort(),用于对集合进行排序

          db.集合名称.find().sort({字段:1,...})

        参数1为升序排列

        参数-1为降序排列

    #根据性别降序,在根据年龄升序
    db.test.find().sort({gender:-1,age:1})

      9、统计个数

        方法count()用于统计结果集中文档条数

          db.集合名称.find({条件}).count()

          db.集合名称.count({条件})

    db.test.find({gender:true}).count()
    
    db.test.count({age:{$gt:20},gender:true})

      10、消除重复

        方法distinct()对数据进行去重

          db.集合名称.distinct("去重字段":{条件})

    db.test.distinct("hometown",{age:{$gt:18}})

     8、聚合

    聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤、等功能,然后经过一系列的处理,输出相应的结果。

      db.集合名称。aggregate({管道:{表达式}})

    常用管道:

    在MongoDB中,文档处理完毕后,通过管道进行下一次处理,常用管道如下:

      $group:将集合中的文档分组,可以用于统计结果

      $match:过滤数据,只输出符合条件的文档

      $project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果

      $sort:将输出文档排序后输出

      $limit:限制聚合管道返回的文档书数

      $skip:跳过指定数量的文档,并返回余下的文档

      $unwind:将数组类型的字段进行拆分

    表达式

    处理输入文档并输出

    语法:表达式:“$列名”

    常用表达式

      $ sum:计算总和,$sum:1表示以一倍计数

      $avg:计算平均值

      $min:获取最小值

      $max:获取最大值

      $push:在结果文档中插入值到一个数组中

      $first:根据资源文档的排序获取第一个文档数据

      $last:根据资源文档的排序获取最后一个文档数据

    $group对应的字典中有几个键,结果中就有几个键

    分组依据需要放在_id后面

    取不同的字段的值需要使用$,"$age"、“$gender”

    取字典嵌套的字典中的值的时候“$_id.country”

    能够同时按照多个建进行分组“{$group:{_id:{country:$country,province:"$province"}}}”

      结果是:{_id:{country:"",province:""}}

    #统计男生、女生总人数
    db.test.aggregate({¥group:{_id:"$gender",counter:{$sum:1}}})
    #Group by null 
    #将所有文档分为一组
    #求学生总人数、平均年龄
    db.test.aggregate({$group:{_id:null,counter:{$sum:1},avgAge:{$avg:"$age"}}})

    $project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果

    #查询学生的姓名和年龄
    db.stu.aggregate({$project:{_id:0,name:1,age:1}})
    #查询男生、女生人数,输出人数
    db.stu.aggregate({$group:{_id:"$gender",counter:{$sum:1}}},{$project:{_id:0,counter:1}})
    db.stu.aggregate({$group:{_id:"$gender",count:{$sum:1},aug_age:{$avg:$age}}},{$project:{gender:"$_id",count:"$count",avg_age:"$avg_age"}})

    $match:过滤数据,只输出符合条件的文档

    #查询年龄大于20 的学生
    db.test.aggregate({$match:{age:{$gt:20}}})
    #查询年龄大于20 的男生、女生人数
    db.test.aggregate({$match:{age:{$gt:20}}},{$group:{_id:"$gender",counter:{$sum:1}}})

     $sort:将输出文档排序后输出

    #查询学生信息,按年龄升序
    db.stu.aggregate({$sort:{age:1}})
    #查询男生和女生人数,按人数的降序排序
    db.stu.aggregate({$group:{_id:"gender",count:{$sum:1}}},{$sort:{count:-1}})

    $limit:限制聚合管道返回的文档书数

    #显示前两条记录
    db.test.aggregate({$limit:2})

    $skip:跳过指定数量的文档,并返回余下的文档(一般先使用skip,再使用limit

    #跳过指定2条数量记录
    db.test.aggregate({$skip:2})

    $unwind:将数组类型的字段进行拆分

      db.集合名称.aggregate({$unwind:"$字段名称"})

    db.test.insert({_id:1,item:"t-shirt",size:["S","M","L"]})
    db.test.aggregate({$unwind:"$size"})

    结果如下:

    {“_id”:1,"item":"t-shirt","size":"S"}

    {“_id”:1,"item":"t-shirt","size":"M"}

    {“_id”:1,"item":"t-shirt","size":"L"}

    属性perserveNullAndEmptyArrays,值为false表示丢弃属性值为空的文档

    属性perserveNullAndEmptyArrays,值为true表示保留属性值为空的文档

    用法:db.test.aggregate({$unwind:{path:"$size",perserveNullAndEmptyArrays:true}})

    #perserveNullAndEmptyArrays:true #防止数据丢失

  • 相关阅读:
    爱国论
    windows cmd: 打开windows系统程序或服务的常见命令
    Windows最常用的几个网络CMD命令总结
    什么是DNS劫持和DNS污染?
    windows cmd: 增强windows命令行
    NAT
    电信光纤猫 f412超级密码
    jvm之java类加载机制和类加载器(ClassLoader)的详解
    经典中的经典算法 动态规划(详细解释,从入门到实践,逐步讲解)
    首次适应算法、最佳适应算法和最差适应算法
  • 原文地址:https://www.cnblogs.com/zhiliang9408/p/10013958.html
Copyright © 2011-2022 走看看