您的位置:首页 > 数据库 > Mongodb

mongodb aggregate 聚合操作

2016-03-08 13:53 423 查看

何为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表进行的操作,最坏的情况下需要全表扫描,如果表的记录很多,速度就很慢了,也会消耗更多的内存。

为了提高性能,最好的策略是将筛选“工序”放到最前面,尽早排除不满足条件的记录,降低后面工序的工作量。如果最前面的筛选工序能够利用上索引,可加快整个操作的速度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: