一、概述 mongodb是最接近關係型資料庫的NOSQL資料庫,它的存儲方式非常的靈活;以至於你會將它看成是一個經過冗餘過的關係型資料庫的表,這也是Mongodb原子性的一個特征。由於沒有關係型資料庫的表之間的關聯關係和事務性所以Mongodb插入和更新的效率非常的高,同時也支持索引。我們在查詢的時 ...
一、概述
mongodb是最接近關係型資料庫的NOSQL資料庫,它的存儲方式非常的靈活;以至於你會將它看成是一個經過冗餘過的關係型資料庫的表,這也是Mongodb原子性的一個特征。由於沒有關係型資料庫的表之間的關聯關係和事務性所以Mongodb插入和更新的效率非常的高,同時也支持索引。我們在查詢的時候不能帶著關係型資料庫的思維,可以簡單的把集合看成是關係型資料庫的表、文檔看成是行、鍵看成是欄位;但是Mongodb的鍵可以是數組也可以是文檔這又像是支持xml類型的關係型資料庫的欄位。
版本:3.4.10
插入測試數據
db.test.insert( [ {name:"short sleeve", type:10, size:["S","M","L"], buyer:{ name:"chen", city:"guangzhou" }, saleDetial:[{dates:ISODate("2012-11-02"),price:100,sales:10}, {dates:ISODate("2012-11-03"),price:110,sales:5}, {dates:ISODate("2012-11-04"),price:90,sales:15} ] }, {name:"coat", type:11, size:["M","L"], buyer:{name:"zhang", city:"shanghai"}, saleDetial:[{dates:ISODate("2012-11-02"),price:500,sales:20}, {dates:ISODate("2012-11-03"),price:600,sales:15}, {dates:ISODate("2012-11-04"),price:400,sales:30} ] }, {name:"fleece", type:12, size:["S","M","L"], buyer:{name:"wang", city:"shenzhen"}, saleDetial:[{dates:ISODate("2012-11-02"),price:350,sales:30}, {dates:ISODate("2012-11-03"),price:400,sales:15}, {dates:ISODate("2012-11-04"),price:500,sales:10} ] } ] )
二、簡單查詢
1.簡單鍵
只查詢name,type列;相當於select name,type from test
db.test.find( {}, {"_id":0,"name":1,"type":1} )
查詢名稱等於“coat”的數據
db.test.find( {name:"coat"}, {"_id":0,"name":1,"type":1} )
2.文檔嵌套數組
註意:數組的下標從0開始
1.查詢size數組的第一個元素等於M的記錄
db.test.find( {"size.0":"M"} )
2.查詢size數組保護M的記錄
db.test.find( {"size":"M"} )
3.文檔嵌套文檔
查詢鍵buyer內嵌文檔鍵name等於“chen”的文檔
db.test.find( {"buyer.name":"chen"}---列出文檔內的元素的方法 ) 或者 db.test.find( {"buyer":{"name":"chen", "city":"guangzhou"}} )
註意:如果使用完整的文檔嵌套文檔的查詢方法,那麼內嵌文檔中的所有鍵值都要列出來匹配
4.文檔嵌套數組嵌套文檔
1.查詢數組中的文檔鍵等於
db.test.find( {"saleDetial.price":"400"} )
2.查詢數組中第二個元素的文檔鍵等於
db.test.find( {"saleDetial.1.price":"400"}, {"_id":0,"name":1,"type":1,"saleDetial.price":1} )
三、運算符
1.比較運算符
MongoDB 與 RDBMS語句比較
1.查詢數組第一個元素的price大於400的文檔
db.test.find( {"saleDetial.0.price":{$gt:400}}, {"_id":0,"name":1,"type":1,"size":1,"saleDetial":1} )
2.$or運算符
查詢price大於500或者price小於100的文檔
db.test.find( {$or:[{"saleDetial.price":{$gt:500}},{"saleDetial.price":{$lt:100}}]}, {"_id":0,"name":1} )
註意:$or運算符之後是用中括弧,裡面的兩個條件分別用大括弧
3.$and運算符
1.查詢價格大於100並且size等於S的文檔名:select name from test where price>100 and size='S'
db.test.find( {$and:[{"saleDetial.price":{$gt:100}},{"size":"S"}]}, {"_id":0,"name":1} ) 等價於 db.test.find( {"saleDetial.price":{$gt:100},"size":"S"}, {"_id":0,"name":1} )
對應$and預設可以省略。
註意:如果是同一個欄位的and條件必須這樣寫
db.test.find({"saleDetial.price":{$gt:300,$lt:500}})
下麵這種寫法是錯誤的,這張寫法會認為是多個鍵值的的查詢條件,最終的結果就是price>300 or price <500
db.test.find({"saleDetial.price":{$gt:300},"saleDetial.price":{$lt:500}})
4.$in運算符
相當於關係型資料庫的IN
查詢price大於100且buyer.name是zhang,chen的文檔
db.test.find( {$and:[{"saleDetial.price":{$gt:100}},{"buyer.name":{$in:["zhang","chen"]}}]}, {"_id":0,"name":1,"buyer":1} )
4.$nin運算符
$nin是in的否則條件
db.test.find( {$and:[{"saleDetial.price":{$gt:100}},{"buyer.name":{$nin:["zhang","chen"]}}]}, {"_id":0,"name":1,"buyer":1} )
5.$mod:取模匹配運算符
相當於關係型資料庫的%運算
查詢type%2餘數為1的文檔
db.test.find( {"type":{$mod:[2,1]}}, {"_id":0,"name":1,"buyer":1,"type":1} )
6.$not否定運算
查詢type%2餘數不等於1的文檔
db.test.find( {"type":{$not:{$mod:[2,1]}}}, {"_id":0,"name":1,"buyer":1,"type":1} )
7.null值判斷
//插入測試數據
db.nullvar.insert([{"x":null},{"x":1},{"x":2}])
//查詢null值的數據
db.nullvar.find({"x":null})
在以前2.6之前的版本查詢null值非常的麻煩,代碼如下:
db.nullvar.find({"x":{"$in":[null],"$exists":true}})
8.模糊查詢
使用正則表達式
//查詢name以包含short的文檔
db.test.find( {"name":/short/}, {"_id":0,"name":1,"buyer":1,"type":1} )
//查詢name以short開頭的文檔
db.test.find( {"name":/^short/}, {"_id":0,"name":1,"buyer":1,"type":1} )
//?查詢
db.test.find( {"name":/^coa?t/}, {"_id":0,"name":1,"buyer":1,"type":1} )
9.日期時間查詢
四、擴展操作
1.sort、skip、limit
db.test.find( {$or:[{"saleDetial.price":{$gt:400}},{"type":{$mod:[2,0]}}]}, {"_id":0,"name":1,"buyer":1,"type":1} ) .sort({"type":-1}) .skip(1) .limit(10)
相當於關係型資料庫的寫法:
select name,buyer,type from test where price>400 or type%2=0 order by type desc limit 1,10
參考:http://www.runoob.com/mongodb/mongodb-query.html
備註: 作者:pursuer.chen 博客:http://www.cnblogs.com/chenmh 本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明鏈接,否則保留追究責任的權利。 《歡迎交流討論》 |