MongoDB的查詢


1.多查詢條件

向查詢文檔加入多個鍵/值對的方式可以實現多個查詢條件的組合。例如要查詢所有用戶名為“joe”且年齡為27歲的用戶,可以像下面這樣:

1 >db.users.find({“username” : “joe”, “age” : 27})

2.指定返回結果的鍵

例如,如果只需要用戶集合的“username”和“email”鍵感興趣,可使用如下查詢:

1 >db.users.find({}, {“username” : 1, “email” : 1})

同時也可以剔除查詢結果中的某個鍵/值對,例如如果不希望結果中有“fatal_weakness”鍵,命令如下:

1 >db.users.find({}, {“fatal_weakness” : 0})

也可以用來防止返回“_id”。

3.查詢條件

“$lt”小於,”$lte”小於等於,“$gt”大於,“$gte”大於等於,“$ne”不等於,例如:

1 >db.users.find({“age” : {“$gte” : 18, “$lte” : 30}})

$in類似Mysql中的IN,用法如下:

1 >db.raffle.find({“ticket_no” : {“$in” : [725, 542, 390]}})

$or類似Mysql中的OR,用法如下:

1 >db.raffle.find({“$or” : [{“ticket_no” : 725}, {“winner” : true}]})

$not類似Mysql中的邏輯操作符NOT,用法如:

1 >db.user.find({“id_num” : {“$not” : {“$mod” : [5, 1]}}})

說明:“$mod”會將查詢的值除以第一個給定值,若余數等於第二個給定值則返回該結果。

注意:一個鍵可以應用多個條件句,但不能對應多個更新修改器。

4.特定類型的查詢

null:

null不僅僅匹配自身,而且匹配缺少這個鍵的所有文檔。若僅僅想要匹配鍵值為null的文檔,用法如下:

1 >db.c.find({“z” : {“$in” : [null], “$exists” : true}})

正則表達式:

MongoDB使用Perl兼容的正則表達式(PCRE)庫來匹配正則表達式,PCRE支持的正則表達式語法都能被MongoDB所接受。例如可以使用正則表達式執行忽略大小寫的匹配,如下:

1 >db.users.find({“name” : /joe/i})

數組:

若要查詢數組中的元素,可以理解為每個元素都是整個鍵的值。例如:

>db.food.insert({“fruit” : [“apple”, “banana”, “peach”]})

那么查詢“fruit”鍵的值中包含“banana”的文檔如下:

1 >db.food.find({“fruit” : “banana”})

但要是想通過多個元素來匹配數組時,要使用“$all”,例如:

1 >db.food.find({“fruit” : {“$all” : [“apple”, “banana”]}})

內嵌文檔:

查詢內嵌文檔的方法:查詢整個文檔,或者只針對其鍵/值對進行查詢。例如有如下文檔:

 1 {
 2 
 3          “name” : {
 4 
 5          “first” : “Joe”,
 6 
 7          “last” : “Schmoe”
 8 
 9 }
10 
11 “age” : 45
12 
13 }

查詢整個內嵌文檔如下:

1 >db.people.find({“name” : {“first” : “Joe”, “last” : “Schmoe”}})

但需要注意這里的“name”鍵的值必須匹配整個文檔。

只針對內嵌文檔的特定鍵值進行查詢如下:

1 >db.people.find({“name.first” : “Joe”, “name.last” : “Schmoe”})

查詢數組中嵌套內嵌文檔:

若文檔結構如下:

 1 {
 2 
 3          “content” : “joe”,
 4 
 5          “comments” : [
 6 
 7          {
 8 
 9                    “author” : “joe”,
10 
11                    “score” : 3,
12 
13                    “comment” : “nice post”
14 
15 },
16 
17 {
18 
19          “author” : “mary”,
20 
21          “score” : 6,
22 
23          “comment” : “terrible post”
24 
25 }
26 
27 ]
28 
29 }

那么要查詢由Joe發表的5分以上的評論,寫法如下:

1 >db.blog.find({“comments” : {“$elemMatch” : {“author” : “joe”, “score” : {“$gte” : 5}}}})

5.游標

獲取游標的方法如下:

1 >var cursor = db.foo.find().sort({“x” : 1}).limit(1).skip(10);
2 
3 >while(cursor.hasNext()) {
4 
5 …obj = cursor.next();
6 
7//do stuff
8 
9 …}

這里游標類還實現了迭代器接口,可以在foreach循環中使用。

1 >cursor.forEach(function(x)) {
2 
3 …print(x.name);
4 
5 });

注意:幾乎所有游標對象的方法都返回游標本身,這樣就可以按任意順序組成方法鏈。

上述內容中的limit(n)表示限制結果的數量,只返回n個結果。而skip(n)表示略過前n個文檔,然后返回余下的文檔。sort()用一個對象作為參數:一組鍵/值對,值代表排序方向,排序方向可以是1(升序)或者-1(降序),如果指定了多個鍵,則按照多個鍵的順序逐個排序。

注意:用skip略過少量的文檔還是不錯的,但要是數量非常多的話,skip會變得很慢,應避免過大的skip。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM