MongoDB 聚合+管道

MongoDB中聚合(aggregate)主要用於處理數據(諸如統計平均值,求和等),並返回計算後的數據結果。有點類似sql語句中的count(*)。

語法

>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

實例

集合中的數據格式:
{
    "_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()計算結果如下:


根據資源文檔的排序獲取最後一個文檔數據


下表展示了一些聚合的表達式:


管道的概念

管道在Unix和Linux中一般用於將當前命令的輸出結果作爲下一個命令的參數。
MongoDB的聚合管道將MongoDB文檔在一個管道處理完畢後將結果傳遞給下一個管道處理。管道操作是可以重複的。
表達式:處理輸入文檔並輸出。表達式是無狀態的,只能用於計算當前聚合管道的文檔,不能處理其它的文檔。

這裏我們介紹一下聚合框架中常用的幾個操作:
  • $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管道操作符處理後,前五個文檔被"過濾"掉。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章