MongoDB的聚合框架实现sum()、avg()、group by等聚合操作。通过聚合框架,还可对返回的结果进行处理,实现一些特殊需求,例如数据过滤、别名显示、增加字段、提取子字段等。
1 聚合框架组件
聚合框架包含两大组件:管道和表达式。
1.1管道
管道与unix管道类似,实质就是把扫描的数据输入聚合进程,进行一些过滤、分组、求和等操作,这些操作是通过管道操作符完成的。
例如,实现类似SQL:select b as ok from test111,
聚合语句如下:db.test111.aggregate([{$project:{_id:0,ok:"$b"}}]);
{
"result" : [
{
"ok" : 2
},
……………………省略………………………………
{
"ok" : 10000
}
],
"ok" : 1
}
$project管道操作符就是用来控制字段输出的,本例$project不让_id字段显示,只显示字段b,并且用别名”ok”显示。与unix类似,多个管道操作符是可以一起使用的。例如,上面的结果,只要求显示前2行,可以用$limit管道操作符,语句如下:mongos> db.test111.aggregate([{$project:{_id:0,ok:"$b"}},{ $limit : 2 },{$match:{ok:{$ne:2}}}])
{ "result" : [ { "ok" : 3 } ], "ok" : 1 }
还有其他的管道操作符:$group,$skip,$sort等
1.2表达式
表达式实际就是对管道的结果进行一些计算,例如求平均值,最大值,记录条数等。Sql语句:select * from (select avg(b),max(b),count(a) from test111 group by a) where rownum<=3,对应的mongo查询语句如下:db.test111.aggregate([
{ $group: {
_id: "$a",
avg_b: { $avg: "$b" },
max_b: { $max: "$b" },
nb_b: { $sum: 1 }
} },{ $limit : 3 }
]);
2 聚合运算性能优化
db.test.aggregate({$group:{_id:{EN_T:"$EN_T",EN_N:"$EN_N"}, SE:{$sum:"$S_PT"}}},{$limit:20},{$sort:{TIME:-1}})
聚合操作会把集合内容输入管道,然后计算输出。优化的目标就是要尽量让输入管道的内容更少一些。
2.1下面的管道操作符出现在管道开头时