zoukankan      html  css  js  c++  java
  • PYTHON2.day12

    前情回顾
    1.关系型数据库 和 非关系型数据库 的比较
         *NoSql不是关系模型构建的数据库,不保证数据的一致性,结构灵活自由
         *NoSql弥补了关系数据库在处理高并发数据请求时读写速度慢的缺点
         *NoSql种类多样,技术成熟度不如关系模型,没有统一的操作语句,处于发展的上升阶段
    2.MongoDB数据库的特点,安装,命令设置
    3.MongoDB的组成结构
    4.创建数据库
         use database    创建数据库
         db.dropDatabase()删除数据库
         show dbs    查看数据库
         mongodump    备份
         mongorestore    恢复
         mongostat    数据库监控
         mongotop    数据库的读写时长
        
    5.集合操作
         db.createCollection()    创建集合
         db.collection.insert()    集合不存在创建集合
         db.collection.drop()    删除集合
         db.collection.renameCollection()    重命名
         db.getCollection('collection_name')    获取集合对象
         show collection    查看集合
        
    6.插入文档
         insertOne()        插入一个文档
         insertMany()    插入多个文档
         insert()
         save()            当ID冲突时可以修改原文档

    ********************************************************************************
    一.查找操作
         1.命令格式
             mysql : select ... from table where ...
             mongo : db.collection.find(query,field)
            
         2.查找函数用法
             1.find(query,field)
                 功能:查找所有符合条件的文档                 
                 查找集合中所有内容:db.collection.find()
                
                 参数:query    表示筛选条件,是一个键值对构成的文档,空文档,表示查找所有内容
                       field 表示要查找的域,事宜个键值对构成的文档,空文档表示查找所有的域
                      
                 返回值:返回查找的所有文档
                     e.g.查找年龄为18的文档,性别为男的文档
                  db.class0.find({age:18})
                 find_age_18             db.class0.find({sex:'m'})

             find_sex_m
                   e.g. 不查找_id ,查找name,age域
                  db.class0.find({},{_id:0,name:1,age:1})
          

    find_1_0
                * _id域如果不想查找则写_id:0,查找则不写
                 * 除_id外其他域要么全为0表示不查找这些域,要么全为1表示查找指定的域
                 返回值:返回查找的所有文档

                    e.g.查找性别为m的文档,不查找_id域,只差name,age
                         db.class0.find({sex:'m'},{_id:0,name:1,age:1})

           find_0_1_0_error             
                 findOne(query,field)
                    功能: 查找第一条符合条件的文档
                    参数: 同find

                    e.g.  查找第一个年龄为18岁的文档
                         db.class0.findOne({age:18},{_id:0})

                 findOne_age_18       
    二.query
         操作符:mongodb中使用$符号注明一个有特殊意义的字符串,用以表达丰富的含义.比如:$lt 表示小于
             $eq 等于 =
                 eg.年龄等于17
                 db.class0.find({age:{$eq:17}},{_id:0})

    $rq_age_17
             $lt 小于 <
                eg.年龄小于18
                 db.class0.find({age:{$lt:18}},{_id:0})

    $lt_age_18
                 eg.姓名<Jame
                 db.class0.find({name:{$lt:'Jame'}},{_id:0})

    $lt_name_jame
            $gt  大于 >
                e.g.  大于16小于19的 (表达区间关系)
                 db.class0.find({age:{$gt:16,$lt:19}},{_id:0})

    gt_
             $lte  小于等于  <=
             $gte  大于等于  >=
             $ne   不等于    !=
             $in   包含

                e.g. 查找年龄在数组范围内的文档
                 db.class0.find({age:{$in:[15,16,19]}},{_id:0})

    $in_15_16_17
             $nin  不包含
                e.g. 查找年龄不包含在数组中的
                 db.class0.find({age:{$nin:[18,16]}},{_id:0})

    nin

    三.逻辑操作符
             [1]$and 逻辑与
                 1.在query文档中逗号隔开的键值对即表示与关系
                   eg.年龄18 并且 性别为男
                   db.class0.find({age:18,sex:'m'},{_id:0})

    and
                 2.$and 表示逻辑与
                   eg.年龄18 并且 性别为男
                   db.class0.find({$and:[{age:{$lt:18}},{sex:'m'}]},{_id:0})

    and2
                 * 在query中,逗号分隔的多个条件也表示与关系
                  eg.年龄不等于17且性别为男
                    db.class0.find({$and:[{age:{$ne:17}},{sex:'m'}]},{_id:0})

    $and

           [2]$or 逻辑或
                 eg.年龄小于17或性别为女
                 db.class0.find({$or:[{age:{$lt:17}},{sex:'w'}]},{_id:0})

                 or_1
             [3]$not 逻辑非
                 eg.性别不是女
                 db.class0.find({sex:{$not:{$eq:'f'}}},{_id:0})

    not1
                 eg.年龄不大于17
                 db.class0.find({age:{$not:{$gt:17}}},{_id:0})
        not2       
             [4]$nor 逻辑既不也不 --> not (A or B)
                eg.年龄既大于17,性别也不为男
                 db.class0.find({$nor:[{age:{$gt:18}},{sex:'m'}]},{_id:0})

          nor      
             [5]条件混合
                eg.年龄(大于18 或者小于17)并且性别为男的
                 db.class0.find({$or:[{age:{$gt:18}},{age:{$lt:17}}],sex:'m'},{_id:0})

    混合1
                 eg.年龄大于等于17的男生,或者 姓名叫Lily
                 db.class0.find({$or:[{age:{$gte:17},sex:'m'},{name:'Lily'}]},{_id:0})   
      混合2     
    四.数组查找操作符
         数组:一组数据的有序集合,用[]表示
              *有序性
              *数据类型可以混合
            1.查找数组中包含某一项
                 e.g.  查找数组中包含大于90的文档
                 db.class1.find({score:{$gt:90}},{_id:0})

       包含大于90的class1       
            2.查找数组中同时包含多项的  $all   
                 e.g.  查找数组中同时包含80 75 的
                 db.class1.find({score:{$all:[80,75]}},{_id:0})
       
       包含80又包含75的       
             3.根据数组元素个数查找  $size
                e.g.  查找数组中包含两个元素的
                 db.class2.find({score:{$size:2}},{_id:0})

      size        
             4.选择数组的显示部分 $slice (用于field参数) 
                 e.g.显示数组的前2项
                 db.class2.find({},{_id:0,score:{$slice:2}})

    显示前两项
                 e.g.跳过第一项显示后面两项
                 db.class2.find({},{_id:0,score:{$slice:[1,2]}})

    跳过第一项

            5.其他查找操作符
                1.$exists 判断一个域是否存在 值为bool
                    eg.查找不存在score域的文档
                    db.class1.find({score:{$exists:false}},{_id:0})

         exists1   
                2.$mod  通过除数和余数查找文档
                   eg. 查找age域除以2余数为0的
                    db.class0.find({age:{$mod:[2,0]}},{_id:0})

    $mod

                3.$type  根据值的数据类型筛选
                     eg. 查找age数据类型为1的文档
                     db.class0.find({age:{$type:1}},{_id:0})

    type
                     * 数据类型和数字对照表参看文档 $type说明
                     * 没见过的操作符可以通过mongodb文档 search,查看文档说明
                    
    五.数据操作函数
         1.  db.collection.distinct(field)
                 功能:获取某个集合中某个域的值范围
                 参数:域名
                 返回值:取值范围数组
                 eg.查看class1中age域有哪些值
                 db.class1.distinct('age')

       distinct         
         2.  pretty()
             功能: 将find结果格式化显示
             db.class1.find().pretty()

    pretty

        3.  limit(n)
             功能: 显示find结果的前n条文档
             参数:n指示显示数量
             e.g.  显示查找结果的前3条
             db.class1.find({},{_id:0}).limit(3)

    limit

       4.  skip(n)
             功能:跳过前n条文档,显示后面的内容
            eg. 跳过前5条文档,显示后面内容
             db.class1.find({},{_id:0}).skip(5)

    skip       
         5.  count()
             功能:统计查询结果数量 
             eg. 统计有多少年龄大于17的文档
             db.class0.find({age:{$gt:17}}).count()

    count

        6.    sort({field:1/-1})
             功能:对查找文档按照某个域的值排序
             参数:表示要排序的域
            eg. 对查找文档按年龄升序排序(1表示升序,-1表示降序)
             db.class0.find({},{_id:0}).sort({age:1})

    sort

        7.    复合排序:对多个域进行排序,当第一排序项相同时,参考第二排序项排序
             eg.  按age降序,若age相同时,按照sex升
             db.class0.find({},{_id:0}).sort({age:-1,sex:1})

            
        8.  通过连续调用函数获取更丰富结果
             [1]取年龄最大的三位
                 db.class0.find({},{_id:0}).sort({age:-1}).limit(3)
                 符合排序
        9.  通话序列号直接获取查找结果的某一项(0为第一项0)
             eg.获取查找结果的第二项
             db.class0.find({sex:'m'},{_id:0})[1]

            
    练习
         1.创建数据库名为 grade
         2.在数据库中创建集合名为class
         3.在集合中插入若干数据,格式
             {name:xxx,age:xx,sex:xx,hobby:[xx,xx,xx]}
             年龄:7--14
             hobby:drow dance running sing football  computer  python
         4.查看练习
             查看班级所有人信息
             db.class.find()
             查看班级中年龄为8岁人员信息
             db.class.find({age:8})
             查看年龄大于10岁学生信息
             db.class.find({age:{$gt:12}})
             查看年龄在8-12岁之间的学生
             db.class.find({age:{$gte:8,$lte:12}})
             查看年龄为9 且喜欢画画的女生
             db.class.find({age:9,hobby:'dance',sex:'g'})
             查看年龄小8岁或大于12岁的学生
             db.class.find({$or:[{age:{$lt:8}},{age:{$gt:12}}]})
             查看年龄9岁或者11岁的学生
             db.class.find({age:{$in:[9,11]}})
             查找有两项兴趣的同学
             db.class.find({hobby:{$size:2}})
             查找喜欢计算机的同学
             db.class.find({hobby:'computer'})
             找到既喜欢画画又喜欢跳舞的学生
             db.class.find({hobby:{$all:['dance','drow']}})
             统计兴趣有三项的学生人数
             db.class.find({hobby:{$size:3}})
             找到本班年龄第二大的学生
             db.class.find({}).sort({age:-1}).skip(1).limit(1)
             查看班级中同学兴趣爱好范围
             db.class.distinct('hobby')
             找到班级中年级最小的三个男生
             db.class.find({sex:'m'}).sort({age:1}).limit(3)
            
        
    六.修改文档
         1. 格式对比
             mysql:update table set .. where ...
             mongo:db.collection.updateOne(query,update,update)

         2. 修改函数
             [1]updateOne(query,update,upset)           
                功能:修改第一个符合条件的文档
                参数:query筛选条件 用法同find
                      update 要修改的数据项,要同修改操作符一同使用
                      upset bool值,如果设置为true则如果没有筛选到文档会根据query和update参数插入新的文档
                      eg.将Aliex的年龄修改为30
                         db.class.updateOne({name:'Aliex'},{$set:{age:30}})

    update_set1
                      eg.如果没找到name为Abby的文档则插入新文档
                          db.class.updateOne({name:'Abby'},{$set:{age:18}},{upsert:true})
       

    upsert
            [2]db.collection.updateMany(query,update.upsert)
                 功能:修改所有符合条件的文档
                 参数:用法同updateOne
                eg.修改所有年龄小于18的文档 年龄为21
                 db.class0.updateMany({age:{$lt:18}},{$set:21})

    updateMany
            [3]db.collection.update(query,update,upsert,multi)
                 功能:修改文档
                 参数:query ,update用法用updateOne()
                       upset:功能同 updateOne()
                              写法直接赋值 upsert = true
                       multi:bool值 multi = false 同updateOne
                                    multi = true  同updateMany
                 eg.修改所有年龄为 18的文档年龄为23
                 db.class0.update({age:18},{$set:{age:23}},false,true)
       
      
             [4] db.collection.findOneAndUpdate(query,update)
                 功能:查找第一个符合条件文档并修改
                 参数:query 查找条件
                       update 修改内容
                 返回:返回修改前的文档
                 eg.查找第一个符合条件文档并修改
                  db.class0.findOneAndUpdate({age:23},{$set:{age:19}})

    findOneANdUpdate
             [5]db.collection.findOneAndReplace(query,doc)
                 功能:查找一个文档并替换
                 参数:query 查找条件
                       doc 要替换的文档
                 返回:被替换的文档
                 eg. db.class0.findOneAndReplace({},{name:'Lenzer',age:19})
           findOneAndReplace     
        3.修改操作符(修改器)
             [1]$set:修改一个域的值或者增加一个域
                 eg.name域不存在时可以增加这个域
                 db.class0.updateOne({age:20},{$set:{name:'Joy'}})

    增加一个域
             [2]$unset:删除一个域
                eg.删除Joy的age域
                 db.class0.updateOne({name:'Joy'},{$unset:{age:''}})

    unset
            [3]$rename:给一个域重命名           
                 eg.将所有域名sex修改为gender
                 db.class0.updateMany({sex:{$exists:true}},{$rename:{sex:'gender'}})

    rename
                    
        
    作业:1.熟练数据查找,修改函数用法
          2.续昨天作业中银行数据库,完成指定要求的查找操作

  • 相关阅读:
    WM_SIZE和WM_MOVE的函数体内容为什么不一样?
    java调用计算机显示文档
    把消息送到默认窗口函数里,并非一点用都没有,可能会产生新的消息(以WM_WINDOWPOSCHANGED为例)
    使用SetWindowPos API函数移动窗口后,还需修改Delphi的属性值,以备下次使用,否则就会出问题(不是API不起作用,而是使用了错误的坐标值)
    Delphi调用WINAPI时到底应该是指针还是结构体(注意是Delphi变量本身就是指针)
    TWinControl.SetBounds与TWinControl.UpdateBounds赏析(定义和调用)
    delphi的取整函数round、trunc、ceil和floor
    2013Esri全球用户大会之互操作和标准
    Delphi判断文件是否正在被使用(CreateFile也可以只是为了读取数据,而不是创建)
    Delphi 的运算符列表,运算符及优先级表格 good
  • 原文地址:https://www.cnblogs.com/shengjia/p/10452575.html
Copyright © 2011-2022 走看看