【MongoDB】聚合
聚合(Aggregation)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。MongoDB提供了3中方式来执行聚合命令:
- 聚合管道方法
- map-reduce方法
- 单一目标聚合方法
1.聚合管道方法
语法格式:
db.collection_name.agreegate(
[
{
$match:{<field>} // 统计查找条件
},
{
$group:{<field1>,<field2>} // field1指定分类字段,field2为各种统计操作符,如:$sum、$avg、$min、$max、$push、$addToSet、$first、$last
}
]
)
// 插入测试数据
db.custInfo.insert(
[
{custId:"A001",custName:"马岱",deptNo:"D01",sal:20000,addr:"云南"},
{custId:"A002",custName:"关羽",deptNo:"D01",sal:50000,addr:"云南"},
{custId:"A003",custName:"曹真",deptNo:"D02",sal:10000,addr:"云南"},
{custId:"A004",custName:"司马懿",deptNo:"D02",sal:30000,addr:"山东"}
]
)
// 查询出addr为云南的记录,并按deptNo分组统计sal
db.custInfo.aggregate(
[
{
$match:{addr:"云南"} // 查找条件
},
{
$group:{
_id:"$deptNo",total:{$sum:"$sal"}
}
}
]
)
说明:_id:"$deptNo",deptNo为分类字段,_id为必须指定唯一性字段,不能修改;total为统计结果字段,可以修改为任意新名称。
2.map-reduce方法
语法格式:
db.collection_name.mapreduce(
function() {emit(<this.field1>,<this.field2>)}, // 对字段field1、field2进行map(映射操作)
function(key,values) {return Array.sum(values)}, // 对map过来的field1、field2进行reduce(归约)操作,求sum
{query:{<field>},out:<"result_name">} // query定义查询条件,out定义返回结果的变量名
)
该方式进行聚合操作,效率较聚合管道方式要低,而且使用更复杂。
var mr=db.custInfo.mapReduce(
function(){
emit(this.deptNo, this.sal); // map自定义函数
},
function(key, values){
return Array.sum(values)// Reduce自定义函数
},
{
query:{addr:"云南"},
out:"Total"
}
)
//------------------分割线-------------------------------------------
// 输出计算结果
db.Total.find()
3.单一目标聚合方法
语法格式:db.collection_name.count(query,options)
说明:统计集合中里符合条件的文档数量,query为查询条件,option参数可以为:limit,skip,hint等
示例:
// 统计custInfo集合的总记录数
db.custInfo.count()
// 统计addr为云南的记录数
db.custInfo.count({addr:"云南"},{skip:1})
单一目标聚合方法,可以直接在find后使用:db.custInfo.find({custName:"曹真"}).count()
作者:奔跑的金鱼
声明:书写博客不易,转载请注明出处,请支持原创,侵权将追究法律责任
个性签名:人的一切的痛苦,本质上都是对自己无能的愤怒
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!