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 }  }  )

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章