MongoDB的管道聚合
管道聚合可以实现很多数据处理和统计功能,并且随着不断的更新,其功能也越来越丰富。代表着NoSQL数据库的一种发展趋势。
管道聚合通过aggregate语句实现,支持多种匹配、处理、输出方式。
其语法是:
db.<collection>.aggregate([{operator},{operator},{operator}......])
管道聚合操作中的前一条字句的处理结果可作为后一条字句的输入,从而实现管道化的顺序处理。管道聚合语句的输出为一组新的文档,可以将这些文档存入集合
语句中的{operator}即管道,由管道操作符和相应参数构成。常见的管道操作符有:$group、$project、$match、$sort、$limit、$skip等
注意:管道聚合是一个强大但繁琐的操作,在需要构建很多个聚合语句,语句当中包含着各式各样的括号嵌套,此时需要特别注意括号的匹配。在操作中很多的错误都是括号匹配错误导致的
1.$group与分组计数
$group表示分组
示例如下:
db.<collection>.aggregate({"$group":{"_id":"$name","num":{"$sum":"$qty"}}})
_id是分组条件,值为集合中name字段的枚举值。num字段的结果为对集合的qty字段进行(分组)求和($num)所得的值
2.$match与文档匹配
$match表示聚合
示例如下:
db.<collection>.aggregate({$match:{"price":{$gt:3.0,$lt:4.0}}})
这个例句的效果相当于
db.<collection>.find({"price":{$gt:3.0,$lt:4.0}})
3.$set与字段赋值
$set表示进行字段赋值,如果字段不存在则新建字段
db.<collection>.aggregate({$set:{descride:"fruit"}})
注意:聚合语句的$set是构造并输出新文档,和更新语句的$set不同,更新语句是将原有的文档进行修改
$set还可以和一些运算操作符结合使用,例如:$add/$subtract/$multiply/$divide(加、减、乘、除)
类似的操作符还有:$log、$pow、$mod、$round(对数计算、指数计算、求余数、取整/保留小数)
有一些运算符使用单个参数例如:$exp(计算以e为底的指数)
向使用单个参数的运算符还有:$abs、$ln、$log10、$sqrt等
4.显示控制
$sort表示排序
$limit表示限制输出的集合
$skip表示跳过n个集合输出
$project表示对显示结果字段进行调整,利用1和0显示开关
5.管道运算
$sum/$avg:求和/求平均
$min/$max:返回最小值/最大值
$first/$last:返回第一个/最后一个文档的字段数据
$push:将数据插入到一个数组中
注意$min、$max和$push要与$group一起使用
6.$out结果输出
将聚合结果写入新的集合
db.<collection>.aggregate({$group:{_id:"$name",num:{$sum:"$price"}}},{$out:{db:"db_add",coll:"coll_add"}})
$out字句的db是指数据库名,coll是指集合名