一、修改操作符(修改器)

1、 $set   修改一个域 的值

   e.g.    修改Lily的年龄  :

   db.class0.update({name:'Lily'},{$set:{age:17}})

   增加一个域

    e.g.   为Jame增加sex域:

    db.class0.update({name:'Jame'},{$set:{sex:'m'}})

2、$unset     删除一个域   

    e.g.   删除Abby的sex域   sex后为空字符串:

    db.class0.update({name:'Abby'},{$unset:{sex:''}})

3、$rename   修改域的名称

    e.g.  将sex域名改为gender:

    db.class0.update({},{$rename:{sex:'gender'}},false,true)

4、$setOnInsert

    如果使用update插入了文档,则将该修改器内容作为插入的一部分

    e.g. db.class0.update({name:'Jame'},{$set:{age:18},$setOnInsert:                            {gender:'m',tel:'120'}},true)

5、$inc    加法修改器

   e.g.   将所有人age加1:  

    db.class0.update({},{$inc:{age:1}},false,true)

   *参数可以是正数负数,整数小数

 6、$mul   乘法修改器

   e.g.    将所有人age乘2:

   db.class0.update({},{$mul:{age:2}},false,true)

   *参数可以是正数负数,整数小数

7、$min

   如果筛选文档的指定域值小于min值则不修改,大于min值则修改为min值

   e.g.  如果Jame大于17则修改为17

   db.class0.update({name:'Jame'},{$min:{age:17}})

8、$max

   如果筛选文档的指定域大于max值则不修改,小于max值则修改为max值

   e.g.   如果Lenzer age 小于18,则改为18

   db.class0.update({name:'Lenzer'},{$max:{age:18}})                          

 9、数组修改器

       1、$push

         向数组中添加一项

          e.g.  db.class1.update({name:'小红'},{$push:{score:91}})

       2、$pushAll

          向数组中添加多项

          e.g.  db.class1.update({name:'小乔'},{$pushAll:{score:[94,10]}})

       3、$pull

         从数组中删除一项

         e.g. db.class1.update({name:'小红'},{$pull:{score:78}})

         $pullAll   删除多项

        4、$each

          对多个值逐个操作

          e.g.分别插入99,10   

          db.class1.update({name:'小乔'},{$push:{score:{$each:[99,10]}}})

        5、$position

           指定插入位置

           e.g.将67插入到数组1号位置 

           db.class1.update({name:'小明'},{$push:{score:{$each:[67],$position:1}}})            

         6、$sort

           数组排序

           e.g.  将所有score域的数组降序排序   

           db.class1.update({},{$push:{score:{$each:[],$sort:-1}}},false,true)

         7、$pop

           弹出一项      1 表示弹出最后一项     -1表示弹出第一项

           e.g.  db.class1.update({name:'小乔'},{$pop:{score:1}})

            db.class1.update({name:'小明'},{$pop:{score:-1}})

          8、$addToSet

             向数组中添加一项,但是不能添加重复的内容

              e.g.  如果数组中没有81则添加81

              db.class1.update({name:'小刚'},{$addToSet:{score:81}})

二、时间数据类型

存储当前时间方法:

  1、new Date()    自定生成当前时间

     e.g.  db.class2.insert({book:'Python入门',date:new Date()}

  2、ISODate() 自动生成当前时间

     e.g.  db.class2.insert({book:'Python精髓',date:ISODate()})       

  3、Date()   将系统时间转换为字符串

     e.g.   db.class2.insert({book:'Python疯狂',date:Date()})            

   指定时间:ISODate()

          功能:生成mongo标准时间类型数据

          参数:如果不传参默认为当前时间

                传参表示指定时间:"2018-01-01 12:12:12"或"20180101 12:12:12"或"20180101"

            e.g.  db.class2.insert({book:'Python崩溃',date:ISODate('2018-07-01 11:12:45')})            

    时间戳:valueOf()  获取某个时间的时间戳

      e.g.  db.class2.insert({book:'Python涅槃',date:ISODate().valueOf()})

三、Null类型

值     null

  1、如果某个域存在却没有赋值,可以赋值为null

    e.g  db.class2.insert({book:'Python死去活来',price:null})

  2、可以查找某个域不存在的情况

     e.g.  如果date域不存在也能find到

     db.class2.find({date:null})

四、Object(内部文档)

文档内部某个域的值还是一个文档数据则这个文档就是内部文档类型数据
   
  e.g. db.class3.find({'book.title':'围城'},{_id:0})
 
       db.class3.update({'book.title':'围城'},{$set:{'book.price':48.8}})


 通过数组下标直接操作某一项

  e.g.  通过数组下标引用第一项进行查找     

  db.class1.find({'score.0':{$gt:90}},{_id:0})

  e.g.  通过数组下标引用第一项进行修改

  db.class1.update({name:'小刚'},{$set:{'score.0':80}})

五、索引

指建立指定键值及所在文档存储位置的对照清单,使用索引可以方便我们进行快速查找,减少遍历次数提
    高查找效率

 1、 ensureIndex()

    功能:创建索引

    参数:索引域和索引选项
             
       e.g.  根据name域创建索引:

       db.class0.ensureIndex({name:1})

    *1表示正序索引      -1表示逆序索引

 2、查看集合中索引

     db.collection.getIndexes()

 3、自定义索引名称

     db.collection.ensureIndex({},{name:'myIndex'})

     e.g.   db.class0.ensureIndex({age:1},{name:'ageIndex'})


 4、删除索引

    db.collection.dropIndex('index')

     功能:删除索引

     参数:要删除的索引名称或者键值对

      e.g.  db.class0.dropIndex({name:1})

             db.class0.dropIndex('ageIndex')
                     
     db.collection.dropIndexes()

     功能:删除所有索引

      *_id是系统自动创建的主键索引,不能删除

索引类型
      
     1、复合索引

        根据多个域创建一个索引

        e.g.  db.class0.ensureIndex({name:1,age:-1},{name:'name age'})
            
      2、数组索引,子文档索引

         如果对某个域的值为数组或者子文档的域创建索引,那么通过数组或者子文档中
         某一项进行查找也是索引查找

         e.g. 如果对score创建了索引那么该查找就是索引查找

         db.class0.find({'score.1':88})

       3、唯一索引

          创建索引的域要求值不能够重复

           e.g.   db.class0.ensureIndex({name:1},{unique:true})

            *当对某个域创建了唯一索引,就不能插入重复的值                    

       4、稀疏索引(间隙索引)

          只针对有指定索引域的文档创建索引,没有该域的文档不会插入到索引表

          e.g. 只对有age域的文档创建索引

           db.class0.ensureIndex({age:1},{sparse:true})            

  索引约束:

         *索引表需要占用一定的数据库磁盘空间

         *当对数据进行增删改等写入操作时,所以也需要更新,降低了数据修改的效率

         综上:数据量较小时不适合创建索引,当数据库进行频繁的修改操作而不是查找操作时
              也不适合创建索引。针对一个集合并不是创建索引越多越好

六、 聚合操作

db.collection.aggregate()

   功能:完成聚合操作

   参数:聚合条件   -----》集合操作符

   聚合操作符:

     1、  $group  分组聚合  需要配合具体的分组统计选项

     选项: 

         $sum  :  求和

                e.g.  db.class0.aggregate({$group:{_id:'$gender',num:{$sum:1}}})

                       db.class0.aggregate({$group:{_id:'$gender',num:{$sum:'$age'}}})

         $avg  :求平均数

                 e.g.  db.class0.aggregate({$group:{_id:'$gender',avg:{$avg:'$age'}}})

         $max :  求最大值

                  e.g.  db.class0.aggregate({$group:{_id:'$gender',max:{$max:'$age'}}})

          $min   :  求最小值

                  e.g. db.class0.aggregate({$group:{_id:'$gender',min:{$min:'$age'}}})

             
          $project  :修改文档的显示效果

                   e.g.  db.class0.aggregate({$project:{_id:0,name:1,age:1}})

                         db.class0.aggregate({$project:{_id:0,Name:'$name',Age:'$age'}})

          $match  :   数据筛选

                $match值的用法同query一致

                 e.g.  过滤年龄大于18岁的数据文档

                  db.class0.aggregate({$match:{age:{$gt:18}}})

          $limit  :  筛选前几条文档

                e.g  筛选前3条数据文档

                db.class0.aggregate({$limit:3})

          $skip  :跳过几条文档显示后面的数据文档

                 e.g.  db.class0.aggregate({$skip:3})

          $sort   :将数据排序

                  e.g.  按照年龄升序排序

                   db.class0.aggregate({$sort:{age:1}})
                        
   2、 聚合管道
  
         指的是将上一个聚合的操作结果给下一个聚合继续操作          

         db.collection.aggregate([{聚合},{},{}...])

         e.g. db.class0.aggregate([{$match:{gender:'m'}},{$project:{_id:0}},{$sort:{age:1}}])

         e.g.  找到重名学生: 

          db.class0.aggregate([{$group:{_id:'$name',num:{$sum:1}}},{$match:{num:{$gt:1}}}])

七、固定集合

mongodb中可以创建大小固定的集合,称之为固定集合      

 特点:能够淘汰早期数据

       插入和顺序查找速度更快

       可以控制集合的空间大小    

  使用:临时缓冲、日志处理

 
  创建固定集合

      db.createCollection(collection,{capped:true,size:10000,max:1000})

      capped:true   表示创建固定集合

      size:表示指定集合的大小字节

      max:指定集合存放文档上限
           

    e.g. 大小为1000字节,最多存放3条文档

      db.createCollection(collection,{capped:true,size:1000,max:3})