標籤: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)----查詢詳解(下)