一.数据的基本查询:

        1.基本查询{

             1.查询所有的数据

                db.xx.find()

             2.指定条件查询

                db.xx.find(查询条件)

             3. 只查找符合条件的一个

db.xx.findOne()
            db.stu.findOne({gender:true}).pretty()
        }

        2.条件运算 $lt $gt $lte $gte $ne

{
            db.xx.find({字段:{修饰符:值}})
 
             // 取出年龄大于 20岁的人
            db.stu.find(
                {
                  age:{$gt:20}
                }
            )
             // 取出年龄不等于 20岁的
             db.stu.find({age:{$ne:20}})
             
            }

        3.逻辑运算 $and  $or

db.xx.find(
             {
                 $and:[
                     {条件1},
                     {条件2}
                 ]
             }
         )

              

            1. 默认find的多条件 就是 $and

//籍贯是 桃花岛 年龄是18岁的
               db.stu.find(
                   {
                    hometown:"桃花岛",
                    age:18
                   }
               )
 
               db.stu.find(
                   {
                       $and:[
                           {hometown:"桃花岛"},
                           {age:18}
                       ]
                   }
               )

            2. $or

// 来自大理 或者是女生的
               db.stu.find(
                   {
                       $or:[
                           {hometown:"大理"},
                           {gender:false}
                       ]
                   }
               )

               

            3. 混合使用

// 来自桃花岛或者年龄小于45岁 必须是男生
               db.stu.find(
                   {
                       $and:[
                           {
                               $or:[
                                   {hometown:"桃花岛"},
                                   {age:{$lt:45}}
                               ]
                           },
                           {gender:true}
                       ]
                   }
               )
 
               // 来自大理或者来自蒙古   必须男的 年龄大于16
               db.stu.find(
                   {
                       $or:[
                           {hometown:{$in:['大理','蒙古']}},
                           {
                               $and:[
                                   {gender:true},
                                   {age:{$gt:16}}
                               ]
                           }
                       ]
                   }
               )
            }

        4.范围运算符 $in  $nin

{
               // 不是 桃花岛
               db.stu.find(
                {hometown:{$nin:["桃花岛"]}}
            )
               
               // 取 年龄 18 40  45
               db.stu.find(
                   {age:{$in:[18,40,45]}}
               )
            }

               

          5.正则表达式{

               db.xx.find(

                   {字段:'正则表达式'}

               )

 

               1. /正则/

db.stu.find(
                   {
                       name:/黄/
                   }
               )

               2.{$regex:"正则"}

db.stu.find(
                   {
                       name:{$regex:"段"}
                   }
               )

             

               3. 忽略大小写

               3.1 db.stu.find({name:/lily/i})

               3.2 db.stu.find(

{
                       name:{$regex:"lcf",
                            $options:"i"}
                   }
               )
            }

 

        6.自定义函数  $where

 

         db.xx.find(

             {

             $where:带返回值的 匿名函数

             }

         )

            //取年龄 大于20岁的人  age > 20

            db.stu.find(

                {

                    $where:function () {

                        return  this.age > 20

                    }

                }

            )

            

二.查询结果显示

       1.skip 跳过几个显示

       2.limit 允许显示几个

//跳过两个 显示4个
            db.stu.find().skip(2).limit(4)
 
            db.stu.find().limit(4).skip(2)
            
            注意点:  没有顺序之分

 

       3.投影 显示哪些字段; 显示 true  不显示false

db.xx.find(
                {查询条件},
                {字段:true}
            )
            db.stu.find(
                {},
                {name:true}
            )

            

       4.sort 排序:  -1降序 1 升序

// 年龄 排降序, 相同的按照id 降序
            db.stu.find({}).sort({age:-1,_id:-1})

       5.count 统计个数

//统计所有
          db.xx.count()
        //   根据条件
        db.xx.find().count()

         6.distinct 去重

// 取出年龄 小于 60岁的; 籍贯
          db.xx.distinct("去重字段",{查询条件})
 
          db.stu.distinct("hometown",{age:{$lt:60}})

三.聚合查询:

db.xx.aggreagate(
            [
                {管道1},
                {管道2},
                {管道3}
            ]
        )           
            // 多条件的 多件事

                

           1. $group: 分组

                例子:  数据按照 gender性别分组

db.stu.aggregate(
                    
                        {$group:{_id:"$gender"}}
                    
                )

               

                注意:  表达式: $sum $avg $first $last $max $min  $push

                例子: 数据按照 性别分组 求年龄的平均值

  

db.stu.aggregate(
                   {$group:{_id:"$gender",age_avg:{$avg:"$age"}}}
               )

                例子: 按照籍贯分组, 求年龄和

db.stu.aggregate(
                    {$group:{_id:"$hometown",age_sum:{$sum:"$age"}}}
                )

                注意: $push  将分组想取出来的数据 放入到一个列表

                例子:  取出 按照性别分组的 所有人的名字

db.stu.aggregate(
                    {$group:{_id:"$gender",all_name:{$push:"$name"}}}
                )

               

              2.$match: 查找符合条件的数据 ; find 区别

                    查询功能一样

                    match可以配合管道使用的

 

                   例子: 取出年龄大于20人

db.stu.find({age:{$gt:20}})
                   db.stu.aggregate(
                        {$match:{age:{$gt:20}}}
                   )

                   

                    例子: 取出年龄小于40的; 按照性别分组 求年龄平均值($avg)

  

db.stu.aggregate(
                       {$match:{age:{$lt:40}}},
                       {$group:{_id:"$gender",age_avg:{$avg:"$age"}}}
                   )

                   

             3. $project:投影取出部分字段; 显示1  

                   例子: 取出年龄大于20; 按照籍贯分组 求出年龄之和,求年龄平均值; 查看的时候只想看到之和

 

db.stu.aggregate(
                       {$match:{age:{$gt:20}}},
                       {$group:{_id:"$hometown", age_sum:{$sum:"$age"},age_avg:{$avg:"$age"}}},
                       {$project:{age_sum:1,age_avg:1}}
                   )

                   

             4.$sort: 排序 1升序 -1降序

                   例子: 先找 45以下 ;再 安籍贯分组 求平均值, 在 降序, 在投影

db.stu.aggregate(
                       {$match:{age:{$lt:45}}},
                       {$group:{_id:"$hometown", age_avg:{$avg:"$age"}}},
                       {$sort:{age_avg:-1}},
                       {$project:{_id:0}}
                   )

                   

 

             //注意点: 管道是有顺序的 不能随意颠倒; 根据需求

           5. $skip  跳过几个查看

            $limit 允许显示几个

 

                   例子: 先跳2个 在显示 4个

db.stu.aggregate(
                       {$match:{age:{$lt:60}}},
                       {$skip:2},
                       {$limit:4}
                   )
 
                   db.stu.aggregate(
                    {$match:{age:{$lt:60}}},
                    {$limit:4},
                    {$skip:2}
                )

                   

            6. $unwind :将数据列表 分割  拆分

                  例子:按照性别分组, 求出人的名字 $push

   

db.stu.aggregate(
                   {$group:{_id:"$gender", all_name:{$push:"$name"}}},
                   {$unwind:"$all_name"}
               )