MongoDB高級查詢

翻譯自http://www.mongodb.org/display/DOCS/Advanced+Queries部份內容。python

其實內容並不難理解,主要照顧英語苦手的兄弟們,也方便本身。正則表達式

這裏主要是講MongoDB在控制檯中如何進行高級查詢,既有教程內容,也有ME動手實驗的經驗,搞懂了這些規則,對於你再使用其餘語言(Java,ruby,python等)實現查詢時有莫大的幫助,由於基礎的是相通的,只是不一樣的語言實現接口略有差別而已。sql

還有一句想提醒你們,多動手實驗,纔是硬道理。mongodb

<,>,>=,<=數據庫


這四個就不用解釋了,最經常使用的,也是最簡單的。express

db.collection.find({ "field" : { $gt: value } } )   // 大於  : field > value數組

db.collection.find({ "field" : { $lt: value } } )   // 小於  :  field < valueruby

db.collection.find({ "field" : { $gte: value } } )  // 大於等於 : field >= valuepost

db.collection.find({ "field" : { $lte: value } } )  // 小於等於 : field <= valueui

若是要同時知足多個條件,記得要這樣用:

db.collection.find({ "field" : { $gt: value1, $lt: value2 } } )    // value1 < field < value

$ne   不等於

db.things.find( { x : { $ne : 3 } } )

條件至關於x<>3,即x不等於3。

$mod    取模運算

db.things.find( { a : { $mod : [ 10 , 1 ] } } )

條件至關於a % 10 == 1 即a除以10餘數爲1的。

$nin  不屬於

db.things.find({j:{$nin: [2,4,6]}})

條件至關於 j 不等於 [2,4,6] 中的任何一個。

$in     屬於

db.things.find({j:{$in: [2,4,6]}})

條件至關於j等於[2,4,6]中的任何一個。

$all  所有屬於

db.things.find( { a: { $all: [ 2, 3 ] } } )

與$in相似,但必須是[]的值所有都存在。

$size     數量,尺寸

db.things.find( { a : { $size: 1 } } )

條件至關於a的值的數量是1(a必須是數組,一個值的狀況不能算是數量爲1的數組)。

$exists   字段存在

db.things.find( { a : { $exists : true } } )

db.things.find( { a : { $exists : false } } )

true返回存在字段a的數據,false返回不存在字度a的數據。

$type     字段類型

db.things.find( { a : { $type : 2 } } )

條件是a類型符合的話返回數據。


參數類型以下圖:


Type Name
 Type Number
 
Double
 1
 
String
 2
 
Object
 3
 
Array
 4
 
Binary data
 5
 
Object id
 7
 
Boolean
 8
 
Date
 9
 
Null
 10
 
Regular expression
 11
 
JavaScript code
 13
 
Symbol
 14
 
JavaScript code with scope
 15
 
32-bit integer
 16
 
Timestamp
 17
 
64-bit integer
 18
 
Min key
 255
 
Max key
 127
 

Regular Expressions    正則表達式

db.customers.find( { name : /acme.*corp/i } )

相似sql中的like方法。


行開始 /^ 行結束 $/


這裏要特別特別特別地注意一點,關乎查詢效率:

While /^a/, /^a./, and /^a.$/ are equivalent and will all use an index in the same way, the later two require scanning the whole string so they will be slower. The first format can stop scanning after the prefix is matched.

意思大概就是指在查詢以a開頭字符串時,能夠有三種形式, /^a/, /^a./,和/^a.$/ 。後面兩種形式會掃描整個字符串,查詢速度會變慢。第一種形式會在查到符合的開頭後中止掃描後面的字符。


因此要特別注意。


幾個附加參數:


i的意思是忽略大小寫。(這個很重要,很經常使用)


m的意思是支持多行。(不過ME沒有嘗試過)


x的意思是擴展。(也沒用過)

$or  或 (注意:MongoDB 1.5.3後版本可用)

db.foo.find( { $or : [ { a : 1 } , { b : 2 } ] } )

符合條件a=1的或者符合條件b=2的數據都會查詢出來。


與其餘字段一塊兒查詢:

db.foo.find( { name : "bob" , $or : [ { a : 1 } , { b : 2 } ] } )

符合條件name等於bob,同時符合其餘兩個條件中任意一個的數據。

Value in an Array   數組中的值


例如數據庫中存在這樣的數據:

{ "_id" : ObjectId("4c503405645fa23b31e11631"), "colors" : [ "red", "black" ] }

查詢

db.things.find( { colors : "red" } );

便可查到上面那條數據。

$elemMatch   要素符合

t.find( { x : { $elemMatch : { a : 1, b : { $gt : 1 } } } } )

結果:

{ "_id" : ObjectId("4b5783300334000000000aa9"),

  "x" : [ { "a" : 1, "b" : 3 }, 7, { "b" : 99 }, { "a" : 11 } ]

}

x其中一個要素符合那個檢索條件就能夠被檢索出來。(不過通常誰用像x這樣的結構去保存數據呢?)

Value in an Embedded Object    內嵌對象中的值


例如數據庫中存在這樣的數據:

{ "_id" : ObjectId("4c503773645fa23b31e11632"), "author" : { "name" : "Dan Brown", "age" : 38 }, "book" : "The Lost Symbol" }

查詢:

db.postings.find( { "author.name" : "Dan Brown" } );

便可查到上面那條數據。


查詢內嵌對象的屬性,記得要加上「」,字段是「author.name」,而不是author.name。

$not 不是

db.customers.find( { name : { $not : /acme.*corp/i } } );

這是一個與其餘查詢條件組合使用的操做符,不會單獨使用。


只要你理解了前面的查詢操做便可,只是再加上了$not,結果就是獲得了沒有$not的相反結果集。

sort()    排序


這個很是實用。即sql語言中的OrderBy。

db.myCollection.find().sort( { ts : -1 } )

也能夠多個字段排序

db.myCollection.find().sort( { ts : -1 ,ds : 1 } )

這裏的1表明升序,-1表明降序。


通過ME的實驗,小於0的數字就是降序,0以上(包括0)就是升序。

limit()   skip()

這兩個ME想連起來說,他們就是你實現數據庫分頁的好幫手。

limit()控制返回結果數量,若是參數是0,則看成沒有約束,limit()將不起做用。

skip()控制返回結果跳過多少數量,若是參數是0,則看成沒有約束,skip()將不起做用,或者說跳過了0條。

例如:

 db.test.find().skip(5).limit(5)

結果就是取第6條到第10條數據。

snapshot()   (沒有嘗試)

count()   條數

返回結果集的條數。

db.test.count()

在加入skip()和limit()這兩個操做時,要得到實際返回的結果數,須要一個參數true,不然返回的是符合查詢條件的結果總數。

例子以下:

> db.test.find().skip(5).limit(5).count()

9

> db.test.find().skip(5).limit(5).count(true)

4

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/yczz/archive/2010/11/01/5978800.aspx

相關文章
相關標籤/搜索