MongoDB入門系列(三):查詢(SELECT)


一、概述

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}
             ]
}
]
)

二、簡單查詢

顯示DB:
show dbs
顯示集合:
show tables

1.簡單鍵

db.collection.findOne()

僅僅返回單個文檔,相當於使用limit

 

 只查詢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

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須注明文章來源,且在文章開頭明顯處給明鏈接,否則保留追究責任的權利。

《歡迎交流討論》

 


免責聲明!

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



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