標籤:select 設定 slice 年齡 strong 返回結果 mod 相同 多少
1.find函數的要點和使用
find的介紹與使用
MongoDB資料查詢使用find函數,其功能與SQL中的select函數相同,可提供與關係型資料庫類似的許多功能,包含映射、排序等。
db.集合名.find(query,fields,limit,skip)
主要有四個參數:
query:指明查詢條件,相當於SQL中的where語句
fields:用於欄位對應,指定是否返回該欄位,0代表不返回,1代表返回
limit:限制查詢的結果集的文檔數量,指定查詢返回結果集的上限
skip:跳過一定資料量的結果,設定第一條返迴文檔的位移量
注意事項
mongoDB不支援多集合間的串連查詢,find函數一次查詢只能針對一個集合
find參數為空白或者查詢條件為空白文檔時,返回集合中的全部文檔
除了limit和skip作為find函數的參數外,還可以單獨使用limit和skip函數來修飾查詢結果
返回的查詢結果集在預設的情況下是無序的,如果需要對結果集進行排序,可以使用sort函數
db.collection.findOne()只會返回第一條資料
當查詢的集合文檔數量很大時,為了加快資料的查詢速度可以建立索引
除了使用find函數實現基本查詢外,MongoDB還提供了彙總架構,用於複雜查詢
2. 查詢操作符的介紹及使用
2.1條件操作符
$gt >
$gte >=
$lt <
$lte <=
$ne !=
如:某集合B集合中文檔有屬性x值為整數,需尋找10<x<=30的文檔
db.B.find({"x":{"$gt":10,"$lte":30}})
如:從某集合B中尋找日期屬性day值大於2012/01/01的文檔資料db.B.find({"day":{"$gt":new Date("2012/01/01")}})
2.2 $in包含/$nin不包含
$in:查詢匹配指定條件值的文檔;
$nin:查詢不匹配指定條件值的文檔;
SQL:寫法:欄位 in (‘值1‘,‘值1‘.....)
mongodb:db.B.find({"x":{"$in":[‘值1‘,‘值2‘,.....]}})
SQL:寫法:欄位 not in (‘值1‘,‘值1‘.....)
mongodb:db.B.find({"x":{"$nin":[‘值1‘,‘值2‘,.....]}})
$in/$nin優點:可指定不同類型條件和值。
2.3 $or或查詢
$or:查詢匹配多個條件多個值的文檔;
SQL:寫法:欄位1 = ‘xxx‘ or 欄位2 in ( ‘xxx‘).....
Mongodb :db.B.find({"$or":[{"x":{"$in":[‘值1‘,‘值2‘...]}},{"y":"3"}]})
2.4 $all匹配所有
{"name":jack,"age":[1,2,3]}
{"name":jack,"age":[1,4,3]}
db.B.find({"age":{"$all":[2,3]}})
結果:{"name":jack,"age":[1,2,3]}
$all的查詢模式更像是去取交集,即同時滿足查詢條件才能被查詢出來
2.5 $exists判斷屬性是否存在
db.B.find({"name":{"$exists":true}}) --尋找屬性name存在的文檔
db.B.find({"name":{"$exists":false}}) --尋找屬性name不存在的文檔
2.6 屬性值為null的情況
如下操作並可知道:
> db.C.find()
{ "_id" : ObjectId("5018fccd1781352fe25bf511"), "a" : "14", "b" : "14" }
{ "_id" : ObjectId("5018fccd1781352fe25bf512"), "a" : "15", "b" : "15" }
{ "_id" : ObjectId("5018fccd1781352fe25bf510"), "a" : "13", "b" : "13", "c" : null }
> db.C.find({"c":null})
{ "_id" : ObjectId("5018fccd1781352fe25bf511"), "a" : "14", "b" : "14" }
{ "_id" : ObjectId("5018fccd1781352fe25bf512"), "a" : "15", "b" : "15" }
{ "_id" : ObjectId("5018fccd1781352fe25bf510"), "a" : "13", "b" : "13", "c" : null }
可見查詢屬性c值為null文檔,包括屬性c值為null、該屬性c不存在兩個部分。若想只查詢屬性c為null的文檔
如下:
> db.C.find({"c":{"$in":[null],"$exists":true}})
{ "_id" : ObjectId("5018fccd1781352fe25bf510"), "a" : "13", "b" : "13", "c" : null }
2.7 $not元條件句
可與其他條件配合使用,即不在匹配範圍之內的文檔
2.8 $mod模數運算
db.B.find({"age":{"$mod":[5,1]}}) --表示尋找年齡/5餘1的所有文檔
若尋找年齡/5餘1之外的所有文檔,可結合$not運算:
db.B.find({"age":{"$not":{"$mod":[5,1]}}})
2.9 Regex
db.B.find({"name":/jack/i})
2.10 $size
{ "_id" : ObjectId("501e71557d4bd700257d8a41"), "a" : "1", "b" : [ 1, 2, 3 ] }
{ "_id" : ObjectId("501e71607d4bd700257d8a42"), "a" : "1", "b" : [ 1, 2 ] }
> db.C.find({"b":{"$size":2}})
{ "_id" : ObjectId("501e71607d4bd700257d8a42"), "a" : "1", "b" : [ 1, 2 ] }
2.11 $slice
返回數組的一個子集,即對以某屬性為基礎,返回多少條(範圍)。也可以接受位移值和要返回的元素數量,來返回中間的結果。
> db.C.find()
{ "_id" : ObjectId("501e71557d4bd700257d8a41"), "a" : "1", "b" : [ 1, 2, 3 ] }
{ "_id" : ObjectId("501e71607d4bd700257d8a42"), "a" : "1", "b" : [ 1, 2 ] }
> db.C.findOne({},{"b":{"$slice":[2,3]}})
{ "_id" : ObjectId("501e71557d4bd700257d8a41"), "a" : "1", "b" : [ 3 ] }
> db.C.findOne({},{"b":{"$slice":-2}})
{"_id" : ObjectId("501e71557d4bd700257d8a41"), "a" : "1", "b" : [ 2, 3 ]}
2.12 $where
即可執行任務JavaScript作為查詢的一部分。
$where的值可以是function、也可以是字串等等。
db.C.find({"$where":function(){return this.a == "1"}})與db.C.find({"$where":"this.a == ‘1‘"}})
注意:採用$where子句查詢在速度上較常規查詢慢的多。因文檔需要從BSON轉換成javascript對象,然後通過"$where"的運算式來運行。
不用利用索引。可用常規查詢做前置過濾,配置"$where"查詢進行調優,可達到不犧牲效能的要求。
3. 遊標
使用遊標返回find的執行結果,用戶端對遊標的實現通常能對結果進行數量的限制、略過部分結果、排序等有效控制。
var cursor = db.C.find() --定義遊標
while(cursor.hasNext()){
var obj = cursor.next();
print(obj.a);
......
}
db.C.find().limit(10) --限制查詢的結果條數為10條
db.C.find().skip(10) --忽略匹配的前10條,顯示從第11條匹配的文檔開始所有的文檔
db.C.find().sort({"a":-1}) --sort以鍵/值,表示按某個屬性進行排序,1:升序,-1:降序
進階查詢選項:
$maxscan:integer --指定查詢最多掃描的文檔數量
$min:document --查詢的開始條件
$max:document --查詢的結束條件
$hint:document --指定伺服器使用哪個索引進行查詢
$explain:boolean --擷取查詢執行的細節(用到的索引、結果數量、耗時等),而並非真正執行查詢
$snapshot:boolean --確保查詢的結果是在查詢執行那一刻的一致快照
mongoDB學習筆記<一>