mongodb_查詢操作使用_條件查詢、where子句等(轉並學習)


<?php
/*
 mongodb_查詢操作使用_條件查詢、where子句等(轉並學習)

1.find()/findOne()
mongodb數據庫的查詢操作即使用find()或者findOne()函數,也可根據不同的條件進行查詢。查詢的寫法(以find()為例)可以如下:
db.A.find()/db.A.find({})

"{}"是否省略不影響查詢,都表示查找集合A下的所有文檔。也可以以文檔做條件:db.A.find({"a":1,"b":1}),其中查找同時滿足屬
性a等於1且屬性b也等於1的文檔,若需要滿足屬性c等於1,可直接添加到文檔中:db.A.find({"a":1,"b":1,"c":1})。

2.指定鍵的設置
指定鍵的設置即展示,比如某集合有10個屬性,經查詢后只關心集合中文檔的某幾個屬性。如下文檔:
{ "_id" : ObjectId("5018da521781352fe25bf4d2"), "a" : "1", "b" : "1", "c" : "1", "d" : "1", "e" : "1" }
只關系屬性a,b,c可如下設置:
db.A.find({},{"a,":1,"b":1,"c":,"_id":0})
這里的1和0與文檔中的鍵值是不同意義的,這里的1:表示顯示,0:表示不顯示。其中"_id"鍵默認存在的,需要顯示設置。

結果如下:
{ "a" : "1", "b" : "1", "c" : "1" }

 

--------------------------------------條件查詢可類比結構化查詢語句SQL--------------------------------------------
3.條件查詢
3.1 條件操作符
"$lt"===================>"<"
"$lte"==================>"<="
"$gt"===================>">"
"$gte"==================>">="
"$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")}})
適合於需要進行日調度、月調度、周調度數據等業務處理范圍的場合。

3.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優點:可指定不同類型條件和值。

3.3 $or或查詢

$or:查詢匹配多個條件多個值的文檔;

SQL:寫法:字段1 = 'xxx' or 字段2 in ( 'xxx').....
mongodb:db.B.find({"$or":[{"x":{"$in":['值1','值2'...]}},{"y":"3"}]})

3.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]}

3.5 $exists 判斷文檔屬性是否存在

db.B.find({"name":{"$exists":true}})   --查找屬性name存在的文檔
db.B.find({"name":{"$exists":false}})  --查找屬性name不存在的文檔

3.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 }

3.7 $not元條件句

可與其他條件配合使用,即不在匹配范圍之內的文檔,下面可見其用法。

3.8 $mod取模運算

db.B.find({"age":{"$mod":[5,1]}}) --表示查找年齡/5余1的所有文檔

若查找年齡/5余1之外的所有文檔,可結合$not運算:
db.B.find({"age":{"$not":{"$mod":[5,1]}}})

3.9 正則表達式

db.B.find({"name":/jack/i})

3.10 $size

> db.C.find()
{ "_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 ] }

3.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
        ]
}

3.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"查詢進行調優,可達到不犧牲性能的要求。


4 游標

使用游標返回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 --確保查詢的結果是在查詢執行那一刻的一致快照
*/
?>

  


免責聲明!

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



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