mongodb聚合模式介绍

mongodb聚合模式(Aggregation Modalities)

mongodb中提供了三种方法聚合操作。

  • Aggregation Pipelines
  • Map-Reduce
  • Single Purpose Aggregation oprations

聚合管道(Aggregation Pipelines)

在mongodb2.2 中引进了新的聚合框架(aggregation framework),聚合框架可以帮助我们完成SQL相同的聚合函数功能。

提供了强大的数据处理管道(data processing pipelines),管道提供过最基础的滤查询操作。

其他管道操作提供特殊字段的分组文档(grouping document)、排序文档(sorting document),聚合代码采用数组方式操作。

管道提供强大的数据聚合并且使用本地接口操作,是mongodb聚合操作的首选方式。


# 聚合应用 db.orders.aggregate([ {$match:{status:"A"}}, {$group:{_id:"$cust_id",total:{$sum:"$amount"}}} ]) # $match 和 $group 是

mongodb聚合函数原理

Map-Reduce

mongodb还提供map-reduce 做聚合操作。

map-reduce有两个阶段:

    1. map处理遍历文档,emits一个或者多个对象循环输入文档。
    1. reduce

Map-reduce 使用javaScript 函数做map和reduce操作,操作更加灵活多样。与聚合管道相比,map-reduce聚集效率低,比聚合管道更复杂。

db.orders.mapReduce(
    function(){ // map 函数
        emit(this.dust_id,this.amount);
    },
    function(key, values){ // reduce 函数
        return Array.sum(values);
    },
    {
        query:{status:"A"}, // 过滤
        out:"order_totals"  // 输出到另一集合
    }

map-reduce原理

单作用聚合操作

# 排除重复
db.oreders.distinct("cust_id")

# 统计集合总数量
db.foo.count()

# 统计分数为90的人数
db.foo.count({score:90})

# 分组操作,也可以使用聚合管道的$group做
db.records.group( {
    key: { a: 1 },
    cond: { a: { $lt: 3 } },
    reduce: function(cur, result) { result.count += cur.count },
    initial: { count: 0 }
} )



总结

这篇文章只是简单的介绍了mongodb中聚合的使用以及简单的代码例子。如果您需要深入了解那么可以浏览官方的在线文档或者下载离线的pdf文档文件。

实际上聚合的功能做统计是非常实用的,提供了多种聚合操作方法,因此我们应当做灵活选择,更具实际需求做。

来源: 雨林博客(www.yl-blog.com)