PYTHON2.day13

前情回顾
1.查找操作
     find(query,field)
     findOne(query,field)
2.query操作符
     比较:$eq  $lt  $gt  $lte  $gte $in  $nin
     逻辑:$and $or $not $nor
     数组:$all $size
     其他:$exists $mod  $type
3.数据处理函数
     pretty()   limit()    skip()    sort()   count()   distinct()
4.修改
     updateOne(query,update,upsert)
     updateMany(..................)
     update()
     findOneAndUpdate(query,update)
     findOneAndReplace(query,doc)
5.修改器使用
     $set   $unset    $rename
    
**************************************************************************
一.修改器的使用(续)
     1.$inc:加法修改器
        e.g.  所有文档年龄域加1
         db.class0.updateMany({},{$inc:{age:1}})

inc
         e.g.  所有文档年龄域加1.5
         db.class0.updateMany({},{$inc:{age:1.5}})

    inc1.5    
     2.$mul:乘法修改器
         db.class1.updateMany({},{$mul:{age:2}})
         db.class1.updateMany({},{$mul:{age:0.5}})

mul
         e.g.  将han年龄乘以2
         db.class0.updateOne({name:'Han'},{$mul:{age:2}})

      
     *$inc $mul 操作数可以是正数,负数,整数,小数
    
     3.$setOnInsert:当使用update*插入文档时作为补充内容

         eg.当插入新文档时,gender:'m'也会插入
         db.class0.updateOne({name:'Bob'},{$set:{age:19},$setOnInsert:{'gender':'m'}},{upsert:true})
         db.class0.update({name:'Alic'},{$set:{age:22},$unset:{gender:''}}

  2019-03-01_9-44-35      
     4.$max : 指定某个域的值,如果小于规定值则修改为规定值,大于规定值则不变 
         eg.如果Tom的age小于20则改为20,大于20则不变
         db.class0.updateOne({name:'Tom'},{$max:{age:20}})

     max
     5.$min : 指定某个域的值,如果大于规定值则修改为规定值,小于规定值则不变 
         eg.年龄大于25的修改为25
         db.class0.updateMany({name:'Tom'},{$min:{age:25}})
         db.class0.updateMany({},{$min:{age:19}})

min

    6.数组修改器
         [1]$push:向数组中添加一项

             eg.向数组中增加一项97
             db.class1.updateOne({name:'圣枷'},{$push:{score:97}})

      push  
         [2]$pushAll:向数组中增加多项
            eg.向数组中增加两项 5,10
             db.class2.updateOne({name:'圣枷'},{$pushAll:{score:[5,10]}})

    pushall        
        [3]$pull:从数组中删除某一个值(同值全删)
             eg.删除小红score域中的5
             db.class2.update({name:'圣枷'},{$pull:{score:5}})
             eg.删除score数组中大于90的值
             db.class1.updateOne({name:})

        pull    
         [4]$pullAll:同时删除数组中多个值
             eg.同时删除数组中的88和10
             db.class2.update({name:'圣枷'},{$pullAll:{score:[80,10]}})

         pullall
         [5]$pop:从数组中弹出一项
             eg. 删除hehe 的score中最后一项 (1表示最后一项,-1表示第一项)
             db.class1.update({name:'hehe'},{$pop:{score:1}})

         pop
        [6]$addToSet:向数组中添加一项,但是不能添加已有的内容
             eg.向数组中添加81,如果已经存在则无法添加
             db.class1.update({name:'hehe'},{$addToSet:{score:96}})

             addtoset
         [7]$each:对多个值进行逐一操作
             eg.使用rech同时添加90,10
             db.class1.update({name:'hehe'},{$push:{score:{$each:[90,10]}}})

         [8]$position: 指定值的插入位置,配合each
             eg.向数组1号位置插入55
             db.class.update({name:'hehe'},{$push:{score:{$each:[5],$position:0}}})

    position        
        [9]$sort :对数组排序,搭配each使用
             eg.对hehe 的score数组排序,搭配each使用,1升序-1降序
             db.class2.update({name:'hehe'},{$push:{score:{$each:[],$sort:1}}})

            
    sort    
练习:使用之前的grade数据库
         1.将小红的年龄修改为8岁,兴趣爱好变为跳舞画画
         db.class.update({name:'小红'},{$set:{age:8,hobby:['dance','drow']}})
         2.追加小明的兴趣爱好为唱歌
         db.class.update({name:'小明'},{$push:{hobby:'sing'}})
         3.小王多了兴趣吹牛,打篮球
         db.class.update({name:'小王'},{$pushAll:{hobby:['吹牛','basketball']}})
         4.小李兴趣增加跑步,唱歌,但是不能和已经有的一样
         db.class.update({name:'小李'},{$addToSet:{hobby:{$each:['running,sing']}})
         4.班级所有同学年龄加1
         db.class.updateMany({},{$inc:{age:1}})
         5.删除小明的性别属性
         db.class.update({name:'小明'},{$unset:{sex:''}})
         6.小李的第一个兴趣不要了
         db.class.update({name:'小李'},{$pop:{hobby:-1}})
         7.删除小红的爱好中的画画唱歌
         db.class.update({name:'小红'},{$pullAll:{hobby:['drow','sing']}})
    
二.    删除文档
     1.格式对比
         mysql:delete from table where ...
         mongo:db.collections.deleteOne(query)

     2.删除函数的使用
        [1]db.collection.deleteOne(query)
             功能:删除第一个符合条件文档
             参数:筛选条件,用法同find query

             e.g. 删除第一个性别为男的文档
             db.class1.deleteOne({sex:'m'})
             e.g. 删除第一个年龄小于40的
             db.class1.deleteOne({age:{$lt:40}})
            
         [2]    db.collection.deleteMany(query) 
             功能:删除所有复合条件的文档
             参数:query筛选条件
                   {}全删

             eg.删除所有不存在这个域的文档
             db.class1.deleteMany({gender:{$exists:false}})
             e.g. 删除所有年龄大于30性别为m的
             db.class1.deleteMany({age:{$gt:30},sex:'m'})
            
         [3]db.collection.remove(query,justOne)
             功能:删除文档
             参数:query 筛选条件
                   justOne 默认false 此时同deleteMany
                   justOne 设置true  此时同deleteOne

              
             eg. 删除第一个性别为m的文档
             db.class0.remove({sex:'m'},true)
             *db.student.deleteMany({})可以删除集合中所有文档

       
         [4]db.collection.findOneAndDelete(query)
            功能:查找某个文档,并删除
            参数:query
            返回:返回查找到的文档
             eg.查找第一个年龄为17的文档并删除
             db.class0.findOneAndDelete({age:17})

        
三.数据类型
     1.时间类型
        [1]获取当前时间
             (1)new Date()自动生成当前时间
                eg.
                 db.class2.insertOne({book:'Python入门',data:new Date()})

new_date()
            (2)Date() 获取计算机时间生成字符串
                 eg.
                 db.class2.insertOne({book:'python精通',date:Date()})

date()
             (3)ISODate() 自动获取当前时间

ISOdate()
         [2]时间函数
             ISODate(date) 将制定时间转换为mongodb存储时间
             参数:()默认为当前ISO时间
                   ('2019-01-01 11:11:11')通过字符串指定时间
                   ('20190101 11:11:11')
                   ('20190101')
             e.g.
             db.class1.insertOne({book:'Python精通',date:ISODate()})
             db.class2.insertOne({book:'python放弃',date:ISODate('2019-01-01 11:11:11')})

Isodate           
        [3]时间戳valueOf()       
             功能:根据标准时间(SIO date)生成时间戳
            eg. 记录1970.1.1 00:00:00到现在多少毫秒
             db.class2.insertOne({book:'Python涅磐',date:ISODate().valueOf()})

  valueOf          
     2.Null类型数据
         [1]值:null
         [2]含义:(1)表示某个域的值为空
                     eg.表示price域值为空
                     db.class2.insertOne({book:'Python Web',price:null})

null
                  (2)在表达示中表示某个域不存在
                    eg. 查找price域为null或者不存在这个域的文档
                     db.class2.find({price:null},{_id:0})

    null2
     3.Object类型
         [1]定义:文档中每个域的值为文档,则该文档称为object文档,即对象类型
         [2]使用方法:当使用内部文档某个域的值时,需要使用"外部域.内部域"的格式获取。
                      此时该格式需要用引号标记字符串
            eg.通过内部域title查找文档
             db.class3.find({'book.title':'稻草人'},{_id:0})

object1
             e.g. 稻草人修改价格为35
             b.class3.update({"book.title":'稻草人'},{$set:{'book.price':38}})

     object2
     4.数组下标直接引用数组项
         * 在使用数组时,可以直接通过数组域 . 数组下标操作数组的某一项值
        eg.将hehe的score数组中第二项改为85
         eg.db.class1.updateOne({name:'hehe'},{$set:{'score.1':85}})
   
  object3  
练习:试用grade数据库完成
     1.删除所有年龄小于8岁或者大于12岁的同学
     deleteMany({$or:[{age:{$lt:8}},{age:{$gt:12}}]})
     2.给小红第二项爱好改为 跳舞
     updateOne({name:'小红'},{$set:{'hobby.1':'dance'}})
     3.删除兴趣中没有画画的同学
     deleteMany({hobby:{$nin:['drow']}})
     4.给小王增加一个域,备注:{民族:'回族',习俗:'不吃猪肉'}
     update({name:'小王'},{$set{备注:{民族:'回族',习俗:'不吃猪肉'}}})
     5.给小王的备注,增加一项 宗教:'伊斯兰教'
     update({name:'小王'},{$set:{'备注.宗教':'伊斯兰教'}})
    
四.索引
     1.什么是索引?
         索引是建立文档所在位置的查找清单,使用索引可以方便的进行快速查找,减少遍历次数,提高查找效率

    2.索引约束
         1. 索引本身也占有数据库空间,所以当数据量很小时没有必要创建索引消耗
         2. 索引表需要根据数据的修改及时变更,此时会降低数据增删改的效率,
            因此当数据库操作为大量的写操作而不是查找操作时不必创建索引
     3.创建索引
         db.collection.createIndex(index,option)

             功能:创建索引
             参数:索引域 和 索引选项
             eg.为name域创建一个索引
                 db.class0.createIndex({name:1})

             *_id域会由系统自动创建索引,且不能删除
             *1表示正向索引,-1表示逆向索引
index1           

   4.查看一个集合中的索引db.collection.getIndexes()
     getIndexes
     5.自定义索引名称
         eg.通过第二个参数选项定义索引名称为age
         db.class0.createIndex({age:1},{name:'Age'})
     creatindex  
     6.其他索引创建方法
         ensureIndex()
         功能:创建索引
         参数:同createIndex()   
         ensureindex
         createIndexes([{},{}])
         功能:同时创建多个索引
         参数:数组中存入多个索引键值对
         eg.同时创建多个索引
         db.class0.createIndexes([{name:-1},{age:-1}])

        同时创建两个索引
     7.删除索引   
         (1)db.collection.dropIndex()
             功能:删除一个索引
             参数: 索引名或者键值对删除
            eg.通过名称删除索引
             db.class0.dropIndex("age_-1")

dropindex
             eg.通过键值对删除
             db.class0.dropIndex({name:-1})

dropindex2

        (2)db.collection.dropIndexes()
             功能: 删除所有索引 (除了_id)
            eg.删除class0中所有索引
             db.class0.dropIndexes()


    8.其他类型索引
         (1)复合索引:根据多个域创建一个索引
             e.g. 根据name  age两个域(多个域)创建一个索引
             db.class0.createIndex({name:1,age:-1})


         (2)子文档/数组索引:
                 如果对某个域创建索引,该域的值为子文档或者数组,
                 则对数组或者子文档中某一项进行查找也是索引查找。
             e.g. 如果对book域创建索引,则该查找也是索引查找
             db.class3.find({'book.title':'围城'},{_id:0})

        (3)唯一索引:要求创建索引的域,不能有重复的值
            e.g.  对name域创建唯一索引
             db.class0.createIndex({name:-1},{unique:true})

唯一索引不能有重复值

        (4)稀疏索引:如果创建索引时某些文档不存在指定索引域则忽略这些文档
            e.g. 对age域创建稀疏索引
             db.class0.createIndex({age:1},{sparse:true})
   

           
五.聚合操作
     1.定义:对文档进行数据整理,统计,获取(mongodb)
     2.聚合函数
         db.collection.aggrergate()

         功能:完成聚合操作,获取操作数据
         参数:聚合条件,配合聚合操作符使用
     3.聚合操作符
        [1]$gorup 分组聚合 需要配合一定的统计操作符完成
             (1)统计求和:$sum
                 eg.按照性别分组,获取每组人数
                 db.class0.aggregate({$group:{_id:'$gender',num:{$sum:1}}})

group
                 eg.按性别分组,统计年龄之和
                 db.class0.aggregate({$group:{_id:'$gender',Age:{$sum:'$age'}}})

   统计年龄之和             
             (2)统计求平均值:$avg
                eg.按性别分组,求平均年龄
                 db.class0.aggregate({$group:{_id:'$gender',avg:{$avg:'$age'}}})

  avg              
            (3)求最大值:$max,$min
                 eg.按性别分组,求每组最大年龄
                 db.class0.aggregate({$group:{_id:'$gender',Max:{$max:'$age'}}})
                 db.class0.aggregate({$group:{_id:'$gender',Min:{$min:'$age'}}})

       maxmin         
             (4)求第一个数:$first
                 db.class0.aggregate({$group:{_id:'$gender',First:{$first:'$age'}}})
               求最后一个数:$last
                db.class0.aggregate({$group:{_id:'$gender',Last:{$last:'$age'}}})
         firstlast      
         [2]$project 用于获取指定域的集合文档数据
                 值的写法同find的field参数
                 用0表示不获取某一个域,用1表示获取某一个域
                 db.class0.aggregate({$project:{_id:0,name:1,age:1}})
                 e.g. 按照指定域名显示           
                 db.class0.aggregate({$project:{_id:0,Name:'$name',Age:'$age'}})

          priject      
                
作业:
     1.完成银行系统中修改和删除操作练习
     2.复习网络进程,线程使用
     3.操作符和函数的使用

转载于:https://www.cnblogs.com/shengjia/p/10458335.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值