【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()

猜你喜欢

转载自www.cnblogs.com/OliverQin/p/12318996.html