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。