mongoDB -- 高阶

1:查询         注意:mongodb对数值的字符串,和数值类型有严格的区分  字符串也可以比较大小

      基本语法:db.集合名称.find({查询条件},{显示的字段});  //后面的显示的字段可以省略  默认全部显示  显示的字段的格式 {"_id":0/1,"name":0/1} 0 表示不显示 1 表示显示

                         db.集合名称.find().pretty()  //格式化显示 就是好看  在列多的时候就不再一行显示的就是一个对象一个对象的显示

       

      条件操作符:

  • (>) 大于 - $gt
  • (<) 小于 - $lt
  • (>=) 大于等于 - $gte
  • (<= ) 小于等于 - $lte
  •       =     等于    {k:v}或 $eq
         ex : db.student.find(   {   "age":   {  "$gt":19  }    }    );  //查询年龄大于19岁的学生
  db.student.find(   {   "age":   {  "$gt":19 ,"$lt":21 }    }    );  //查询年龄大于19,小于20岁的学生

       逻辑运算:
            与  $and       
            或  $or
            非  $nor
         
           ex : db.student.find({"$or":[
{"age":{"$gt":19}},
{"score":{"$lt":90}}
                                           ]})    //查询age大于19  或则  分数 小于90 的学生
           ex : db.student.find({"$nor":[                          //看清楚了是$nor
{"age":{"$gt":19}},
{"score":{"$lt":90}}
                                           ]})    //查询age大于19  或则  分数 小于90 的学生


        求模运算
               语法 : {"$mod":[20,1]}  // 模20余1的数字
              ex : db.student.find(  {"age":{"$mod":[20,1]  }    }   )  //查询模20余1 的学生


     范围查询: $in   $nin
         ex: db.stu.find({  "name": { $in :[ "张三", "李四"  ,"王五"  ] } })   //查询名字为张三李四王五的人
                db.stu.find({$or:[
                     {name:"张三"},
                      {name:"李四"}
            ]})
      
     
     数组查询  $all  $size $slice  $elemMatch
          ex: db.stu.find({   "course": { $all : ["语文","数学"]   } });   //查询学生中课程包含语文和数学的学生  --  course 是数组   
                 db.stu.find(  { "addr" :{ $all : [ "浙江杭州" ] } }  )   //这样也行  //addr 可不是数组
                     利用index下表从0开始
db.stu.find( { "course.1" :  " 数学 "} )   //查询course数组中第二个是数学的人
                 db.stu.find( { "course" : {  $size : 2 }   }  )    // 查询数组长度为2的人
                 db.stu.find( {"age" : 19}  ,  {  course : { $slice  :  2 }  }  )  //只打印数组前两个的信息  可以是 -2  取后两个的信息
          db.stu.find (  {"age" : 19 } , {course : {$slice  : [ 1, 2 ] } } )  //取中间的信息  -- 含头不含尾

    嵌套集合查询   parents  是数组  数组里面是对象 里面有 Job
           db.stu.find(    { parents : { $elemMatch : {  job  :  "局长" }  }  }   )  //查询学生父母中有是局长的  
                         注意 : 别弄复杂的数据


        字段的判断: $exists  
        ex: db.stu.find( { "course" :  { $exists : true } }  )   //查询含有course字段的数据
              db.stu.find ( { "course" : { $exists : false  } } )   //查询不含有course 字段的数据



where条件过滤  -- 不建议用 索引不起作用  但能支持js语法
           ex: db.stu.find( {$where : "this.age>20 " } )   //查询age 大于20的学生
                 db.stu.find("this.age>20")   //简化版

                 db.stu.find($where:function(){
return this.age>20
})

                 db.stu.find (function(){
return this.age>20;
})
          
         模糊查询 -- 正则运算
             基础语法 : {key : 正则标记}
             完整语法 : {  key : { $regex : 正则标记  , $options : 选项 }   }
 options  i:忽略大小写
        m : 多行查找
        x :  空白字符串除了被转移的或在字符内中以外的完全被忽略
                                     s : 匹配所有的字符( .)包括换行
注意 如果直接使用则只能使用 i   和M  想用其他的就要用 $regex
            ex: db.stu.find( {"name" : / 陈 / } )  //查询名字包含陈的 学生
                     db.stu.find(  {"name" : / a / i } )   //忽略大小写 i 对中文肯定是无效的
                      db.stu.find( {name : { $regex : / a /i  }  } )
           数据排序  1升序  -1降序
ex:  db.stu.find().sort( { "score" : -1 } )  //查询分数并降序排列
           自然排序 -- 先后顺序
                ex : db.stu.find().sort( {" $natural " : -1} )   //从后往前排


  数据分页显示
                 skip ( n )  : 表示跨过多少数据
                 limit (  n ) : 取出的数据个数限制
ex : db.stu.find().skip(0).limit(5) //取出前5个
               db.stu.find().skip(0).limit(5).sort( { "age" : -1 } )  //
                db.stu.find().skip(5).limit(5).sort(  {"age " : -1 }  )



2 : 数据的更新   -- 比较麻烦 建议 删掉重新插入 $set  -- 更新操作符
      语法: db.集合.update(更新条件 , 新的对象数据 , upsert , multi )
                upsert : 如果更新的数据不存在就增加 ( true  , false) 
multi : 是否只更新第一条数据  (true : 全更新, false : 第一条)
                ex : db.stu.update (  {age : 19}  ,  {  "$set" : {  "score" :  100  } }   ,false  , true )  //

     修改器 -- 像$set 一样
               $inc :主要针对于一个数字字段,增加某个字段段落的数据内容;
语法: { $inc : {  "成员" : 内容  }  }  
               ex : db.stu.update (  { "age" : 19 } , { $inc  : {score : -30 ,age : +1}} , false  , true)  //分数-30 age +1岁
               $set:进行内容的重新设置;
语法: {$set : {"成员" : "新内容" } }
ex: db.stu.update ( {"age":20} , {$set : {score : 89}}  , fasle  ,true)    //修改分数为89 
$unset : 删除某个成员的内容;
语法:{ $unset :{"成员" : 1}  }  
ex: db.stu.update({"name":"张三"} , {$unset : { score : 1 ,  age: 1  } }) //删除字段score和age
$push: 相当于将内容追加到指定的成员之中 ( 基本上是数组 )  -- 只能增加一个 若是写两个就是数组里面套数组
  语法: { $push : { 成员 : value} }
ex: db.stu.update ( {name : "张三" } , {$push : { "course " : ["体育"]  } } )  //往课程里面加课程
如果没有数组就创建,如果有就添加
$pushAll :追加多个内容
语法: { $pushAll : { 成员 : 数组内容} }
ex: db.stu.update ( {name : "张三" } , {$push : { "course " : ["体育" , "美术" ]  } } ) // 一次添加多个
$addToSet: 向数组里面增加一个新的内容,只有不存在的时候添加  
语法 : { $addToSet : { 成员 : 内容}  }  //内容不能是数组  若是数组 就是添加数组了
ex: db.stu.update( { name : "王五" } , {$ addToSet : { course : "体育"  }  } )  //不存在体育则增加,存在则不管
$pop  : 删除数组的内容: 
语法:{  $pop:{成员 : 内容 } }    内容-1 删除第一个    1 删除最后一个
ex: db.stu.update( {name:"王五"} , { $pop : { course : -1  } } )
  $pull : 从数组内删除一个指定内容的数据
语法: { $pull : { 成员 : 内容 }  }  //有就删除 没有就算了
ex: db.stu.update({name : "王五"} , { course : "音乐" }  )  
$pullAll : 一次删除多个内容
语法: { $ pullAll : {成员 : [ "数学" ,"语文" ] } }
ex: db.stu.update( {name : " 王五"}  ,{ $pullAll : { course : ["数学" ,"语文"] }  } )
$rename : 为成员名称重命名
语法: { "$rename" : { 旧的成员名称 : 新的成员名称 }  }
ex: db.stu.update( { "name " : "张三" } , {  $rename : { "name" : "姓名" }  } )


3:删除数据
db.stu.remove( { 条件} , 是否只删一个 )   // true/false 1/0 
ex:   db.stu.remove( {} )//删除全部
db.stu.remove ( {"name" : "王五"} , true )  //只删除一个
db.stu.drop() //删除集合

4:游标
游标就是指的数据可以一行一行的进行操作,只需用find()函数就可以返回游标
hasNext()  //判断是否有下一条数据
next();//读取一条数据
  ex : var cursor=db.stu.find()
cursor.hasNext();
cursor.next();
while(cursor.hasNext()){
var doc=cursor.next();
print(doc.name);    //控制台输出。。不是console
printjson(doc);//用Json输出
}
5.索引
查询默认情况下的索引
db.stu.getIndexes();
自定义索引
语法:db.集合名称.ensureIndex(  {列 : 1  }  )  //升序 -1 为降序
ex: db.stu.ensureIndex (   {age : -1}  )
删除检索
db.news.dropIndexes();
设置唯一索引
    ex: db.stu.ensurIndex(  { "name" : 1 } , { "unqiue"  :  true} )  //name 字段上的内容不许重复  name:1 表示建立索引

设置过期索引
对于文档应有time --存时间的字段
db.phones.insert( {"tel":110,code:110,time : new Date() }  )
ex:db.phones.ensureIndex( {time:1 } ,{  expireAfterSeconds : 10 } ) //设置文档10s后过期,但是时间不准,可以进行临时数据保存

全文检索
设置全文检索
db.news.ensureIndex( {"title" : "text" , " content" : "text " } )   //text 就是设置字段的全文检索
使用全文检索 “$text”  查询 "$search"
 |--查询指定关键字  {$search : " 查询关键字"}

 |--或的关系   { $search : "查询关键字 查询关键字 。。。" }

 |--与的关系  { $search : " \"查询关键字\"  \"查询关键字\" ..."   }

 |--排除某一个 {$search : " 查询关键字 查询关键字。。。 - 排除关键字"}

ex: db.stu.find( "$text" : {$search : "查询关键子 查询关键字 "})

一次设置所有为全文检索

db.news.ensureIndex( {"$**": "text" } )

打分查询

ex: db.stu.find( "$text" : {$search : "查询关键子 查询关键字 "},{score : {$meta : textScore }  } ) //分值越高越好

db.stu.find( "$text" : {$search : "查询关键子 查询关键字 "},{score : {$meta : textScore }  } ).sort( {score : {$meta : textScore }  }  )

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值