MongDB基礎學習(五)——投影,分頁,排序,彙總,mongdb分頁
MongDB基礎學習(五)——投影,分頁,排序,彙總
基礎文法的學習
馬上就要過年啦,明天也是情人,後天就要放假啦,希望自己能夠在放假前把五和六的章節寫完。很高興的一點,昨天看到我寫的“【MongoDB for Java】Java操作MongoDB”能夠被放到CSDN部落格的首頁的頭條,本章節的學習內容如下:
(1) MongoDB的投影的文法和樣本學習
(2) MongoDB的Limit()和Skip()方法學習,從而達到分頁的效果
(3) MongoDB的sort() 方法學習
(4) MongoDB的彙總方法學習,主要用於返回資料記錄和計算結果
5.1 MongoDB的投影
mongodb 投影意思是只查詢必要的資料而不是查詢一個檔案的全部資料。如果一個文檔有5個欄位,需要顯示只有3個,然後選擇其中只有3個欄位。
(1) find() 方法
MongoDB 的find()方法,在MongoDB查詢文檔解釋接受第二個選擇性參數是要檢索的欄位列表。在MongoDB中,當執行find()方法,那麼它會顯示一個文檔所有欄位。要限制這一點,需要設定的欄位列表值1或0。 1用來顯示欄位而0是用來隱藏欄位。
(2) 文法
find()方法具有投影基本文法如下:db.COLLECTION_NAME.find({},{KEY:1})
(3) 樣本
> db.web_app.find()
{ "_id" :ObjectId("54d877e4ebde50baebb6c4c8"), "name" : "追夢客", "oldName" :"好童話", "description" : "這是一個VR旅遊電子商務網站" }
{ "_id" :ObjectId("54d87cdfebde50baebb6c4c9"), "name" : "好童話", "des" : "這是一個o2o的vr旅遊平台" }
{ "_id" :ObjectId("54d87cdfebde50baebb6c4ca"), "city" : "西安", "address" :"www.dreamerkr.com.cn" }
> db.web_app.find({},{"_id":0,"name":1})
{ "name" : "追夢客" }
{ "name" : "好童話" }
{ }
可以看到,這裡只顯示我們需要查詢的欄位。這個在開發API介面的經常會用到,我們只想外面暴露部分資料,可以加強資料安全性。
5.2 MongoDB的分頁
MongoDB的分頁主要用到Limit()和Skip()方法,它們基本的操作如下:
(1) Limit() 方法
要限制 MongoDB 中的記錄,需要使用 limit() 方法。 limit() 方法接受一個數字型的參數,這是要顯示的文檔數(這個Mysql的limit的是有區別的,大家學習的時候,可以進行比較學習,想一下mysql或者其他資料庫操作,MongoDB裡是怎麼完成,自我感覺這樣加深學習)。
(2) 文法:
limit() 方法的基本文法如下:db.COLLECTION_NAME.find().limit(NUMBER)
(3) 樣本
>db.web_app.find()
{ "_id" :ObjectId("54d877e4ebde50baebb6c4c8"), "name" : "追夢客", "oldName" :"好童話", "description" : "這是一個VR旅遊電子商務網站" }
{ "_id" :ObjectId("54d87cdfebde50baebb6c4c9"), "name" : "好童話", "des" : "這是一個o2o的vr旅遊平台" }
{ "_id" : ObjectId("54d87cdfebde50baebb6c4ca"),"city" : "西安", "address" : "www.dreamerkr.com.cn" }
> db.web_app.find().limit(2)
{ "_id" :ObjectId("54d877e4ebde50baebb6c4c8"), "name" : "追夢客", "oldName" :"好童話", "description" : "這是一個VR旅遊電子商務網站" }
{ "_id" : ObjectId("54d87cdfebde50baebb6c4c9"),"name" : "好童話", "des" : "這是一個o2o的vr旅遊平台" }
(4) Skip()方法
方法skip() 也接受數字類型的參數,並使用跳過的文檔數。例如skip(5),意思就是跳過前五條資料,顯示後面的資料。請注意,預設值skip()方法是0,也就是說我們可以調用skip不傳參數,MongoDB會給一個預設參數0.
(5) 文法
skip()方法基本文法如下: db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
(6) 樣本
> db.web_app.find()
{ "_id" :ObjectId("54d877e4ebde50baebb6c4c8"), "name" : "追夢客", "oldName" :"好童話", "description" : "這是一個VR旅遊電子商務網站" }
{ "_id" :ObjectId("54d87cdfebde50baebb6c4c9"), "name" : "好童話", "des" : "這是一個o2o的vr旅遊平台" }
{ "_id" :ObjectId("54d87cdfebde50baebb6c4ca"), "city" : "西安", "address" :"www.dreamerkr.com.cn" }
> db.web_app.find().limit(2).skip(2)
{ "_id" :ObjectId("54d87cdfebde50baebb6c4ca"), "city" : "西安", "address" :"www.dreamerkr.com.cn" }
這裡就是MongoDB的分頁操作,頁面顯示兩條資料,就像mysql的{begNum}, {endNum},這裡換成啦db.web_app.find().limit(endNum-begNum).skip(begNum)意思就從第幾行開始讀取N記錄。
5.3 MongoDB的排序
(1) sort() 方法
要在 MongoDB 中的文檔進行排序,需要使用sort()方法。 sort() 方法接受一個文檔,其中包含的欄位列表連同他們的排序次序。要指定排序次序1和-1。 1用於升序排列,而-1用於降序。
(2) 文法
sort() 方法的基本文法如下:db.COLLECTION_NAME.find().sort({KEY:1})
(3) 樣本
如果不指定排序優先,然後sort() 方法將文檔顯示在升序排列
> db.web_app.find()
{ "_id" : ObjectId("54d877e4ebde50baebb6c4c8"),"name" : "追夢客", "oldName" : "好童話","description" : "這是一個VR旅遊電子商務網站" }
{ "_id" : ObjectId("54d87cdfebde50baebb6c4c9"),"name" : "好童話", "des" : "這是一個o2o的vr旅遊平台" }
{ "_id" : ObjectId("54d87cdfebde50baebb6c4ca"),"city" : "西安", "address" : "www.dreamerkr.com.cn" }
> db.web_app.find().sort({"name":1})
{ "_id" : ObjectId("54d87cdfebde50baebb6c4ca"), "city": "西安","address" : "www.dreamerkr.com.cn" }
{ "_id" : ObjectId("54d87cdfebde50baebb6c4c9"),"name" : "好童話", "des" : "這是一個o2o的vr旅遊平台" }
{ "_id" : ObjectId("54d877e4ebde50baebb6c4c8"),"name" : "追夢客", "oldName" : "好童話","description" : "這是一個VR旅遊電子商務網
5.4 MongoDB的彙總
彙總操作過程中的資料記錄和計算結果返回。彙總操作分組值從多個文檔,並可以執行各種操作,分組資料返回單個結果。在SQL COUNT(*)和groupby 相當於MongoDB的聚集。
(1) aggregate() 方法
對於在MongoDB中聚集,應該使用aggregate()方法。
(2) 文法
aggregate()方法的基本文法如下:db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
(3) 樣本
> db.web_info.find()
{ "_id" : ObjectId("54d87cdfebde50baebb6c4c9"),"name" : "好童話", "address" : "這是一個o2o的vr旅遊平台" }
{ "_id" :ObjectId("54db2e0fc50ae3624c1a555c"), "name" : "追夢客", "address" :"http://www.dreamerkr.com" }
{ "_id" :ObjectId("54db2e2ac50a6a0d0c6a8c98"), "name" : "追夢客", "address" :"http://www.dreamerkr.com" }
{ "_id" :ObjectId("54db2e36c50a607e6eb3d548"), "name" : "追夢客", "address" :"http://www.dreamerkr.com" }
{ "_id" :ObjectId("54db2e6bc50a5f841ad5c196"), "name" : "追夢客", "address" :"http://www.dreamerkr.com" }
{ "_id" : ObjectId("54db2e6bc50a5f841ad5c197"),"name" : "tom" }
{ "_id" :ObjectId("54db2ebdc50a86203da25e72"), "name" : "追夢客", "address" :"http://www.dreamerkr.com" }
{ "_id" :ObjectId("54db2ebdc50a86203da25e73"), "name" : "雨打排行" }
{ "_id" :ObjectId("54db2ef5c50a536eb77a3d6d"), "name" : "追夢客", "address" :"http://www.dreamerkr.com" }
{ "_id" :ObjectId("54db2ef5c50a536eb77a3d6e"), "name" : "雨打排行" }
{ "_id" :ObjectId("54dc0687c50acb624c30dfcb"), "name" : "追夢客", "address" :"http://www.dreamerkr.com" }
{ "_id" : ObjectId("54dc0808c50a5945720b1723"),"name" : "追夢客", "address" : "http://www.dreamerkr.com" }
{ "_id" :ObjectId("54dc0808c50a5945720b1724"), "name" : "雨打排行2" }
{ "_id" :ObjectId("54dc09adc50ac37356e0f1a9"), "name" : "追夢客" }
{ "_id" :ObjectId("54dc0a4ac50a4fac80213257"), "name" : "追夢客" }
{ "_id" :ObjectId("54dc0a8cc50ad7af35250807"), "name" : "追夢客2" }
{ "_id" :ObjectId("54dc0ac4c50adf3258a884bf"), "name" : "追夢客2" }
{ "_id" :ObjectId("54dc0baec50ad2416bac179b"), "name" : "追夢客" }
{ "_id" :ObjectId("54dc0cc3c50afa2987800afe"), "name" : "追夢客" }
{"_id" : ObjectId("54dc130fc50a1c2e75e2b05c"),"name" : "追夢客", "address" : "http://www.dreamerkr.com" }
> db.web_info.aggregate([{$group: {_id : "$name", num : {$sum : 1}}}])
{ "_id" : null,"num" : 2 }
{ "_id" : "雨打排行2", "num" : 1 }
{ "_id" : "雨打排行", "num" : 3 }
{ "_id" :"tom", "num" : 1 }
{ "_id" : "追夢客", "num" : 13 }
{ "_id" : "追夢客2", "num" : 2 }
{ "_id" : "好童話", "num" : 3 }
上述使用的情況相當於SQL查詢 select name, count(*) from web_info group by name。在上面的例子中,我們已分組欄位name 文檔,並在每個的次數name先前的值總和遞增。其他聚集運算式列表如下:
運算式 |
描述 |
執行個體 |
$sum |
總結從集合中的所有檔案所定義的值. |
db.web_info.aggregate([{$group : {_id : "$name", num : {$sum : "$address"}}}]) |
$avg |
從所有文檔集合中所有給定值計算的平均. |
db.web_info.aggregate([{$group : {_id : "$name", num : {$avg : "$address"}}}]) |
$min |
擷取集合中的所有檔案中的相應值最小. |
db.web_info.aggregate([{$group : {_id : "$name", num : {$min : "$address"}}}]) |
$max |
擷取集合中的所有檔案中的相應值的最大. |
db.web_info.aggregate([{$group : {_id : "$name", num : {$max : "$address"}}}]) |
$push |
值插入到一個數組產生文檔中. |
db.web_info.aggregate([{$group : {_id : "$name", address : {$push: "$address"}}}]) |
$addToSet |
值插入到一個數組中所得到的文檔,但不會建立重複. |
db.web_info.aggregate([{$group : {_id : "$name", address : {$addToSet : "$address"}}}]) |
$first |
根據分組從來源文件中擷取的第一個文檔。通常情況下,這才有意義,連同以前的一些應用 “$sort”-stage. |
db.web_info.aggregate([{$group : {_id : "$name", first_address : {$first : "$address"}}}]) |
$last |
根據分組從來源文件中擷取最後的文檔。通常,這才有意義,連同以前的一些應用 “$sort”-stage. |
db.web_info.aggregate([{$group : {_id : "$name", last_address : {$last : "$address"}}}]) |