1. 程式人生 > >mongodb aggregate 聚合操作

mongodb aggregate 聚合操作

何為aggregate聚合操作?

mongodb的聚合操作,接受一個名為pipeline的引數和一個可選引數。
pipeline可以理解為流水線,一條流水線上可以有一個或多個工序。所以,mongodb的一次聚合操作就是對一個表進行多個工序的加工,其中的每個工序都可以修改、增加、刪除文件,最終產出我們需要的資料集合。

aggregate示例

進入mongodb命令列,我們有一個名為TestOrder的表,表中的記錄如下

> db.TestOrder.find()
{ "_id" : ObjectId("56dd4b33186888da5d8b4567"), "cust_id" : "A123"
, "amount" : 502, "status" : "A" } { "_id" : ObjectId("56dd4b33186888da5d8b4568"), "cust_id" : "A123", "amount" : 500, "status" : "B" } { "_id" : ObjectId("56dd4b33186888da5d8b4569"), "cust_id" : "A123", "amount" : 500, "status" : "C" } { "_id" : ObjectId("56dd4b33186888da5d8b456a"), "cust_id" : "A123", "amount"
: 500, "status" : "D" } { "_id" : ObjectId("56dd4dad186888c36f8b4567"), "cust_id" : "A123", "amount" : 500, "status" : "A" } { "_id" : ObjectId("56dd4dad186888c36f8b4568"), "cust_id" : "A123", "amount" : 500, "status" : "B" } { "_id" : ObjectId("56dd4dad186888c36f8b4569"), "cust_id" : "A123", "amount" : 500
, "status" : "C" } { "_id" : ObjectId("56dd4dad186888c36f8b456a"), "cust_id" : "A123", "amount" : 500, "status" : "D" }

如果需要按status欄位統計amount總額,並且只統計status為A、B或C的記錄,可以用聚合操作進行統計。
第一步:從TestOrder中找出status為A、B或C的記錄。這是流水線的第一道工序,表示式如下

{ $match: { status: { $in: ['A','B','C'] } } }

第二步:按status統計amount總額。這是流水線的第二道工序,表示式如下

{ $group: { _id: '$status', totalAmount: { $sum: '$amount' } } }

最終的聚合操作命令,以及結果

> db.TestOrder.aggregate([{ $match: { status: { $in: ['A','B','C'] } } }, { $group: { _id: '$status', totalAmount: { $sum: '$amount' } } }])
{
    "result" : [
        {
            "_id" : "C",
            "totalAmount" : 1000
        },
        {
            "_id" : "B",
            "totalAmount" : 1000
        },
        {
            "_id" : "A",
            "totalAmount" : 1002
        }
    ],
    "ok" : 1
}

用流水線來類比mongodb的聚合操作是比較形象的。

聚合操作的效能

聚合操作是對一個mongodb表進行的操作,最壞的情況下需要全表掃描,如果表的記錄很多,速度就很慢了,也會消耗更多的記憶體。
為了提高效能,最好的策略是將篩選“工序”放到最前面,儘早排除不滿足條件的記錄,降低後面工序的工作量。如果最前面的篩選工序能夠利用上索引,可加快整個操作的速度。