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 是
Map-Reduce
mongodb还提供map-reduce 做聚合操作。
map-reduce有两个阶段:
-
- map处理遍历文档,emits一个或者多个对象循环输入文档。
-
- 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" // 输出到另一集合
}
单作用聚合操作
# 排除重复
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文档文件。
实际上聚合的功能做统计是非常实用的,提供了多种聚合操作方法,因此我们应当做灵活选择,更具实际需求做。