Aggregate的使用,有利於我們對MongoDB中的集合進行進一步的拆分。
樣本:
db.collection.aggregate( {$match:{x:1}, {limit:10}, {$group:{_id:"$age"}}});
操作符介紹:
$project:包含、排除、重新命名和顯示欄位
$match:查詢,需要同find()一樣的參數
$limit:限制結果數量
$skip:忽略結果的數量
$sort:按照給定的欄位排序結果
$group:按照給定運算式組合結果
$unwind:分割嵌入數組到自己頂層檔案
============================================================
這是MongoDB官網上的一個Data Model:
{ "_id": "10280",//zipcode "city": "NEW YORK",//城市 "state": "NY",//城市縮寫 "pop": 5574,//人口 "loc": [ //經緯度 -74.016323, 40.710537 ]}
1、查出一個超過1千萬人口的城市
db.zipcodes.aggregate( {$group:{_id:"$state", totalPop:{$sum:"$pop"}}, {$match:{totalPop:{$get:10000000}}});
上面的語句相當於: SELECT state, sum(pop) totalPop from zipcodes group by state having by totalPop >= 10000000;
分析:
$group主要是用於分組,其中_id是用組的類型集合,totalPop是產生的一個新的欄位,用於儲存總數。
其實,document經過$group之後,系統會為其產生一個新的document(新的documment為{"_id":"AK","totalPop":550043}),這在下面的例子中,我們會看得更清楚。
$match,相當於為新產生的document提供查詢功能
2、求平均人口,每個state
db.zipcodes.aggregate( { $group : { _id : { state : "$state", city : "$city" }, pop : { $sum : "$pop" } } }, { $group : { _id : "$_id.state", avgCityPop : { $avg : "$pop" } } } )
上述樣本中出現了兩個$group,那是什麼含義呢。
第一個$group是將原來的zipcodes 這個 document變成新的,如:
{ "_id" : { "state" : "CO", "city" : "EDGEWATER" }, "pop" : 13154}
第二個 $group是在,原有的基礎之上,再進行一次重新格式化資料,再產生新的document,如:
{ "_id" : "MN", "avgCityPop" : 5335},
3、查詢每個州人口最大和最小的城市
db.zipcodes.aggregate({$group:{_id:{state:"$state",city:"$city"}, totalPop:{$sum:"$pop"}}},//統計州的所有人,產生一個新的文檔,是關於州與其總人口{$sort:{"totalPop":-1}},//對新文檔,根據人口數倒序排序{$group:{_id:"$_id.state","biggestCity":{$first:"$_id.city"},//最大人口的城市"biggestPop":{$first:"totalPop"},//最大人口的數量"smallestCity":{$last:"$_id.city"},"smallestPop":{$last:"totalPop"}}},//重新組成一個新的檔案,包含,州名,最大人口數和最小人口數//本來結構到此基本上差不多了//但我們需要再對資料進行格式化{$project:{_id:0,state:"$_id",biggestCity:{name:"$biggestCity",pop:"$biggestPop"},smallestCity:{name:"$smallestCity",pop:"$smallestPop"}}});
資料結構,如下:
{ "state" : "RI", "biggestCity" : { "name" : "CRANSTON", "pop" : 176404 }, "smallestCity" : { "name" : "CLAYVILLE", "pop" : 45 }}