mongoDB學習筆記<一>

來源:互聯網
上載者:User

標籤:select   設定   slice   年齡   strong   返回結果   mod   相同   多少   

1.find函數的要點和使用

find的介紹與使用

MongoDB資料查詢使用find函數,其功能與SQL中的select函數相同,可提供與關係型資料庫類似的許多功能,包含映射、排序等。

 

db.集合名.find(query,fields,limit,skip)

主要有四個參數:

   query:指明查詢條件,相當於SQL中的where語句

   fields:用於欄位對應,指定是否返回該欄位,0代表不返回,1代表返回

   limit:限制查詢的結果集的文檔數量,指定查詢返回結果集的上限

   skip:跳過一定資料量的結果,設定第一條返迴文檔的位移量

 

注意事項

       mongoDB不支援多集合間的串連查詢,find函數一次查詢只能針對一個集合

       find參數為空白或者查詢條件為空白文檔時,返回集合中的全部文檔

  除了limit和skip作為find函數的參數外,還可以單獨使用limit和skip函數來修飾查詢結果

  返回的查詢結果集在預設的情況下是無序的,如果需要對結果集進行排序,可以使用sort函數

  db.collection.findOne()只會返回第一條資料

       當查詢的集合文檔數量很大時,為了加快資料的查詢速度可以建立索引

  除了使用find函數實現基本查詢外,MongoDB還提供了彙總架構,用於複雜查詢

 

2. 查詢操作符的介紹及使用

  2.1條件操作符

    $gt  >

    $gte >=

    $lt  <

    $lte <=

    $ne  !=

    如:某集合B集合中文檔有屬性x值為整數,需尋找10<x<=30的文檔

    db.B.find({"x":{"$gt":10,"$lte":30}})

 

    如:從某集合B中尋找日期屬性day值大於2012/01/01的文檔資料db.B.find({"day":{"$gt":new Date("2012/01/01")}})

 

  2.2    $in包含/$nin不包含

    $in:查詢匹配指定條件值的文檔;

    $nin:查詢不匹配指定條件值的文檔;

 

    SQL:寫法:欄位 in (‘值1‘,‘值1‘.....)

    mongodb:db.B.find({"x":{"$in":[‘值1‘,‘值2‘,.....]}})

 

    SQL:寫法:欄位 not in (‘值1‘,‘值1‘.....)

    mongodb:db.B.find({"x":{"$nin":[‘值1‘,‘值2‘,.....]}})

    $in/$nin優點:可指定不同類型條件和值。

 

  2.3    $or或查詢

    $or:查詢匹配多個條件多個值的文檔;

    SQL:寫法:欄位1 = ‘xxx‘ or 欄位2 in ( ‘xxx‘).....

    Mongodb :db.B.find({"$or":[{"x":{"$in":[‘值1‘,‘值2‘...]}},{"y":"3"}]})

 

  2.4 $all匹配所有

       {"name":jack,"age":[1,2,3]}

    {"name":jack,"age":[1,4,3]}

    db.B.find({"age":{"$all":[2,3]}})

    結果:{"name":jack,"age":[1,2,3]}

    $all的查詢模式更像是去取交集,即同時滿足查詢條件才能被查詢出來

 

  2.5  $exists判斷屬性是否存在

    db.B.find({"name":{"$exists":true}})   --尋找屬性name存在的文檔

    db.B.find({"name":{"$exists":false}})  --尋找屬性name不存在的文檔

 

  2.6  屬性值為null的情況

    如下操作並可知道:

    > db.C.find()

    { "_id" : ObjectId("5018fccd1781352fe25bf511"), "a" : "14", "b" : "14" }

    { "_id" : ObjectId("5018fccd1781352fe25bf512"), "a" : "15", "b" : "15" }

    { "_id" : ObjectId("5018fccd1781352fe25bf510"), "a" : "13", "b" : "13", "c" : null }

    > db.C.find({"c":null})

    { "_id" : ObjectId("5018fccd1781352fe25bf511"), "a" : "14", "b" : "14" }

    { "_id" : ObjectId("5018fccd1781352fe25bf512"), "a" : "15", "b" : "15" }

    { "_id" : ObjectId("5018fccd1781352fe25bf510"), "a" : "13", "b" : "13", "c" : null }

    可見查詢屬性c值為null文檔,包括屬性c值為null、該屬性c不存在兩個部分。若想只查詢屬性c為null的文檔

    如下:

    > db.C.find({"c":{"$in":[null],"$exists":true}})

    { "_id" : ObjectId("5018fccd1781352fe25bf510"), "a" : "13", "b" : "13", "c" : null }

 

  2.7  $not元條件句

    可與其他條件配合使用,即不在匹配範圍之內的文檔

 

  2.8  $mod模數運算

    db.B.find({"age":{"$mod":[5,1]}}) --表示尋找年齡/5餘1的所有文檔

    若尋找年齡/5餘1之外的所有文檔,可結合$not運算:

    db.B.find({"age":{"$not":{"$mod":[5,1]}}})

 

  2.9  Regex

     db.B.find({"name":/jack/i})

 

  2.10 $size

    { "_id" : ObjectId("501e71557d4bd700257d8a41"), "a" : "1", "b" : [ 1, 2, 3 ] }

   { "_id" : ObjectId("501e71607d4bd700257d8a42"), "a" : "1", "b" : [ 1, 2 ] }

   > db.C.find({"b":{"$size":2}})

   { "_id" : ObjectId("501e71607d4bd700257d8a42"), "a" : "1", "b" : [ 1, 2 ] } 

 

  2.11 $slice

    返回數組的一個子集,即對以某屬性為基礎,返回多少條(範圍)。也可以接受位移值和要返回的元素數量,來返回中間的結果。

    > db.C.find()

    { "_id" : ObjectId("501e71557d4bd700257d8a41"), "a" : "1", "b" : [ 1, 2, 3 ] }

    { "_id" : ObjectId("501e71607d4bd700257d8a42"), "a" : "1", "b" : [ 1, 2 ] }

    > db.C.findOne({},{"b":{"$slice":[2,3]}})

    { "_id" : ObjectId("501e71557d4bd700257d8a41"), "a" : "1", "b" : [ 3 ] }

    > db.C.findOne({},{"b":{"$slice":-2}})

    {"_id" : ObjectId("501e71557d4bd700257d8a41"), "a" : "1", "b" : [ 2, 3 ]}

  

  2.12 $where

       即可執行任務JavaScript作為查詢的一部分。

        $where的值可以是function、也可以是字串等等。

  db.C.find({"$where":function(){return this.a == "1"}})與db.C.find({"$where":"this.a == ‘1‘"}})

  注意:採用$where子句查詢在速度上較常規查詢慢的多。因文檔需要從BSON轉換成javascript對象,然後通過"$where"的運算式來運行。

  不用利用索引。可用常規查詢做前置過濾,配置"$where"查詢進行調優,可達到不犧牲效能的要求。

 

3. 遊標

   使用遊標返回find的執行結果,用戶端對遊標的實現通常能對結果進行數量的限制、略過部分結果、排序等有效控制。

  var cursor = db.C.find()     --定義遊標

  while(cursor.hasNext()){

     var obj = cursor.next();

     print(obj.a);

     ......

  }

  db.C.find().limit(10)  --限制查詢的結果條數為10條

  db.C.find().skip(10)   --忽略匹配的前10條,顯示從第11條匹配的文檔開始所有的文檔

  db.C.find().sort({"a":-1})  --sort以鍵/值,表示按某個屬性進行排序,1:升序,-1:降序

  進階查詢選項:

  $maxscan:integer  --指定查詢最多掃描的文檔數量

  $min:document     --查詢的開始條件

  $max:document     --查詢的結束條件

  $hint:document    --指定伺服器使用哪個索引進行查詢

  $explain:boolean  --擷取查詢執行的細節(用到的索引、結果數量、耗時等),而並非真正執行查詢

  $snapshot:boolean --確保查詢的結果是在查詢執行那一刻的一致快照

 

mongoDB學習筆記<一>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.