Mongodb(五):Mongodb的增刪改查(4)----查詢詳解(下)

來源:互聯網
上載者:User

標籤:style   blog   http   io   ar   使用   java   sp   資料   

(1) $all查詢:用於查詢數組,匹配數組中的元素,要全部匹配才能有結果:樣本:

    

    現在我如果寫成這個樣子: db.customer.find({"books":{"$all":["java", "jQuery"]}}),那麼是查不出結果的,因為

    在document中匹配不到結果,只有將["java", "jQuery"]在document中全部匹配到,才能查詢出來。它與sql語句中的in類似,

    但是必須滿足所有的條件。

(2) 在查詢數組的時候,這樣也是可以查出結果的:db.customer.find({"books":"java"}),如下:

    

    我就一直覺得奇怪,明明是數組,怎麼用這種方式去匹配也能夠成功?不倫不類。暫且這樣理解吧:在數組中,每一個元素都是整個

    鍵的值。

    當然,查詢全部的數組元素肯定是可行的。如下:

    

    但是請注意:一定是要精確的匹配才行,寫成這樣: db.customer.find({"books":["java","c"]})是查不出結果的,寫成這樣:

    db.customer.find({"books":["java","c++","c"]})也是查不出結果的,就是說,連順序都不能變。這更加深了我的疑問,怎

    麼db.customer.find({"books":"java"})這樣匹配就行了?先這樣記著吧。

(3) index的用法:一個問題:現在想查詢第二本書 C 的document,該怎麼辦呢?現在就可以用到數組的下標了,如下:

    

    數組下標是從0開始的。books.1就代表第二個元素

(4) $size:查詢指定長度的數組,比如:現在要查詢有3本書的記錄,可以這樣:db.customer.find({"books":{"$size":3}})

    

    有一點要注意:$size只能精確的查詢,不能做範圍查詢。

(5) $silce查詢:返回一個數組的子集,一看就明白:

    

    說明:db.customer.find({"_id":1}, {"name":1, "books":{"$slice":1}}):顯示數組第一個元素(說得更準確點應該是顯

    示數組的前幾個元素,從第一個元素開始取。也就是說,如果{"$slice":2}),結果就是:["java", "c"].

    db.customer.find({"_id":1}, {"name":1, "books":{"$slice":[1,2]}}):顯示數組區間1--2的元素

    db.customer.find({"_id":1}, {"name":1, "books":{"$slice":-1}}):顯示數組最後一個元素(說得更準確點應該是顯示數

    組的後幾個元素)。看下面就明白了:

   

 

(6) 查詢內嵌的document:

    準備資料:{"_id":1, "name":"zhangsan","address":{"province":"hunan","city":"changsan"}},現在c

    我想尋找province為hunan的資料,可以這樣做,利用 " . "進行尋找:如下:

    db.customer.find({"address.province":"hunan"})

    

    注意:db.customer.find({"address":{"province":"hunan"}})這樣寫是查不出資料的,除非寫成是完全符合的形式:

    db.customer.find({"address":{"province":"hunan", "city":"changsan"}}),這樣是可以查出資料的。前者查不出

    資料也很好理解, "address"這個鍵對應的值是{"province":"hunan", "city":"changsan"},而不是{"province":"hunan"},

    同樣 db.customer.find({"address.province":"hunan"})可以查出資料是因為"address.province"這個鍵對應的value就

    是"hunan".

    *****注意:進行絕對匹配是順序一定不能亂。也不能有比較操作符。

(7) $elemMatch查詢:相對上面來說複雜一點的內嵌document:準備資料如下:   

   {

        "_id":2, 
        "name":"lisi",
        "grade":
        [
           {"course":"math", "score":60, "flag":1},
           {"course":"chinese","score":80, "flag":2},
           {"course":"english","score":75,  "flag":3}
        ]
  }

   現在我想找出course為math,score大於60的記錄,應該怎樣做? 按理說上面這條記錄是查不出來的,因為不符合要求。

   首先的思路可能是這樣的:

   db.stu.find({"grade":{"course":"math", "score":{"$gt":60}}}),這樣肯定是不行的,原因上面已經說過。

   那這樣寫呢?

   db.stu.find({"grade.course":"math", "grade.score":{"$gt":60}}),看著應該可以,但實際上還是不行,這樣

   查的話,可以將上面那條記錄查詢出來。如下:

   

   但實際上是不應該查詢出來的。這是為什嗎?因為{"grade.course":"math", "grade.score":{"$gt":60}}不是一個整體,它可能

   會分開進行匹配。即可能course匹配了math,但score匹配的是80或者75,這樣資料就出來了。

   那應該怎樣做呢?如下所示:

   db.stu.find({"grade":{"$elemMatch":{"course":"math", "score":{"$gt":60}}}})。

   也就是說,$elementMatch是將該條件綁成一個整體,然後再進行匹配。

   說明:"$elemMatch"將限定條件進行分組,僅當需要對一個內嵌文檔的多個鍵操作時才會用到.

(8)"$where"查詢:這是個萬能的查詢,因為是我們自己通過代碼來進行控制的。寫起來也比較容易,就是JS代碼。樣本如下:

    查詢name為zhangsan的使用者的記錄:如下:

    

    可以這樣理解:$where也是一個特殊的鍵,但它的值是一個函數(這種寫法是符合JS的文法格式的)。然後在函數中做我們想做的

    事情。它是怎樣執行的呢?我的理解是每查詢一條document,就會執行這個函數。函數中的this就代表當前進行中匹配的docum

    ent對象,然後通過this取出對象中的屬性進行判斷,如果符合要求就返回true,否則返回false, 一旦返回true,就說明這條記錄

    是符合要求的。至於這個例子,當然用其它的查詢也很容易做到。這裡是為了示範方便,就弄得很簡單。$where查詢方式適用於複雜

    的的查詢。功能很強大,但是不建議使用,說是會犧牲效能,不過這個我也沒體會過。至於有什麼補充的,後面想到再說吧。

(9) limit()函數:取多少條記錄。比如:db.customer.find().limit(5),就是取前面的5條記錄

(10)skip()函數:跳過多少條記錄。比如:db.customer.find().skip(5):就是跳過5條記錄,從6條記錄開始取。

    說明:db.collections名.find().skip(n):跳過n條記錄,從第n+1條記錄開始顯示.

(11)sort()函數:進行排序。文法:db.collections名.find().sort(進行排序的欄位:1), 其中1表示升序,如果是-1就是降序.

   

    在sort中還可以指定多個進行排序的欄位 如: db.persons.find().sort({"age":1, "_id":-1}):就是先按年齡升序,然後

  按照_id降序.

(12)遊標:這個比較容易理解,db.persons.find()就是返回一個指向結果集的遊標。比如我們可以這樣來操作資料:

     var p = db.persons.find()

   while(p.hasNext()){
    var o = persons.next();
     printjson(o);
   }

     結果如下:

     

    注意:遊標幾個銷毀條件  1.用戶端發來資訊叫他銷毀   2.遊標迭代完畢  3.預設遊標超過10分鐘沒用也會別清除

Mongodb(五):Mongodb的增刪改查(4)----查詢詳解(下)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.