MongoDB中聚合(aggregate)主要用於處理數據(諸如統計平均值,求和等),並返回計算後的數據結果。有點類似sql語句中的count(*)。
語法
實例
{
"_id" : ObjectId("577e09da6a857a35563587c0"),
"_class" : "com.market.salepromotionapi.coupon.pojo.CouponPojo",
"couponGroupId" : "C201607070000000003",
"couponGroupName" : "線線線線線線線線線線線線線線線",
"description" : "string",
"price" : 1.0000000000000000,
"range" : [
{
"_class" : "com.market.salepromotionapi.coupon.pojo.GoodsSKUPojo",
"skuId" : "IMHNSKU20160818100188003",
"skuName" : "2室2廳1衛_",
"groupId" : "IMHNGROUP2016081810000188",
"houseId" : "IMHN2016081810000188",
"houseName" : "錢塘玫瑰灣",
"developName" : ""
},
{
"_class" : "com.market.salepromotionapi.coupon.pojo.GoodsSKUPojo",
"skuId" : "IMHNSKU20160818100188002",
"skuName" : "2室2廳1衛_",
"groupId" : "IMHNGROUP2016081810000188",
"houseId" : "IMHN2016081810000188",
"houseName" : "錢塘玫瑰灣",
"developName" : ""
}
],
"type" : 0,
"startTime" : ISODate("2016-07-07T15:50:50.000+08:00"),
"endTime" : ISODate("2017-09-30T15:50:50.000+08:00"),
"createTime" : ISODate("2016-07-07T15:50:50.570+08:00"),
"status" : 5,
"updateList" : [
{
"beanPrice" : 0.0000000000000000,
"logType" : 0,
"status" : 0,
"updateTime" : ISODate("2016-11-18T15:55:10.915+08:00"),
"updater" : "xxxx",
"remarks" : "強制過期"
},
{
"beanPrice" : 0.0000000000000000,
"logType" : 0,
"status" : 0,
"updateTime" : ISODate("2016-11-18T15:55:10.915+08:00"),
"updater" : "xxxxx",
"remarks" : "強制過期"
}
],
"updateTime" : ISODate("2016-11-18T15:55:10.915+08:00"),
"sumbmiter" : "提交人",
"submitTime" : ISODate("2016-10-26T09:21:18.180+08:00"),
"frontDisplay" : "1",
"updater" : "xxxxx",
"submiter" : null,
"checkRecordList" : [
{
"_id" : null,
"checker" : "系統處理",
"status" : 3,
"checkTime" : ISODate("2016-10-26T09:13:06.186+08:00"),
"remarks" : "該優惠券已過期,系統已處理!"
},
{
"_id" : null,
"status" : 2,
"checkTime" : ISODate("2016-10-26T09:21:48.732+08:00"),
"remarks" : ""
}
],
"checker" : null,
"checkTime" : ISODate("2016-10-26T09:21:48.732+08:00"),
"forceEndTime" : ISODate("2016-11-18T15:55:10.915+08:00")
}
現在我們通過以上集合計算每個每個提交人創建的文檔數,使用aggregate()計算結果如下:
管道的概念
表達式:處理輸入文檔並輸出。表達式是無狀態的,只能用於計算當前聚合管道的文檔,不能處理其它的文檔。
- $project:修改輸入文檔的結構。可以用來重命名、增加或刪除域,也可以用於創建計算結果以及嵌套文檔。
- $match:用於過濾數據,只輸出符合條件的文檔。$match使用MongoDB的標準查詢操作。
- $limit:用來限制MongoDB聚合管道返回的文檔數。
- $skip:在聚合管道中跳過指定數量的文檔,並返回餘下的文檔。
- $unwind:將文檔中的某一個數組類型字段拆分成多條,每條包含數組中的一個值。
- $group:將集合中的文檔分組,可用於統計結果。
- $sort:將輸入文檔排序後輸出。
- $geoNear:輸出接近某一地理位置的有序文檔。
1、$project實例
db.article.aggregate( { $project : { title : 1 , author : 1 , }} );
這樣的話結果中就只還有_id,tilte和author三個字段了,默認情況下_id字段是被包含的,如果要想不包含_id話可以這樣:
db.article.aggregate( { $project : { _id : 0 , title : 1 , author : 1 }});
2.$match實例
db.articles.aggregate( [ { $match : { score : { $gt : 70, $lte : 90 } } }, { $group: { _id: null, count: { $sum: 1 } } } ] );
$match用於獲取分數大於70小於或等於90記錄,然後將符合條件的記錄送到下一階段$group管道操作符進行處理。
3.$skip實例
db.article.aggregate( { $skip : 5 });
經過$skip管道操作符處理後,前五個文檔被"過濾"掉。