mongodb aggregate 聚合操作
阿新 • • 發佈:2018-12-24
何為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表進行的操作,最壞的情況下需要全表掃描,如果表的記錄很多,速度就很慢了,也會消耗更多的記憶體。
為了提高效能,最好的策略是將篩選“工序”放到最前面,儘早排除不滿足條件的記錄,降低後面工序的工作量。如果最前面的篩選工序能夠利用上索引,可加快整個操作的速度。