MongoDB主要提供了三种对数据进行聚集分析。
- 管道模式聚集分析
- MapReduce聚集分析
- 简单函数和命令的聚集分析
这里的管道类似于UNIX的管道命令。数据通过一个多步骤的管道,每个步骤都会对数据进行处理,最后返回需要的结果集。
db.books.aggregate([
{
$match:{status:"normal"}
},
{
$group:{_id:"$book_id",total:{sum:"$num"}}
}
]
)
上述的$match和$group是常用的管道命令。
MapReduce聚集
MongoDB也提供了当前流行的Mapreduce的并行编程模型,为海量数据查询分析提供了一种更为高效的方法。用MongoDB做分布式存储,然后再用Map-reduce来做分析。
db.booksmapreduce(
function()
{
emit(this.book_id,this.sum);
},
function(key,values)
{
return Array.sum(values)
},
{
query:{status:"normal"},
outresult:"book_totals"
}
)
等价于传统的sql语句:
select sum(num) as value,book_id as _id from books where status="normal" group by book_id;
简单聚集函数
在数据量不是很大的时候,直接调用基于集合的函数会更简单。常用的简单聚合函数有以下几种。
- distinct函数
- count 函数
- group函数
MapReduce 是一种编程模型,最早有Google提出,MongoDB也在这方面不断地完善、改进,提高其性能,使之成为处理大规模数据集(大于1TB)的利器。Map(映射)和Reduce(归约),和它们的主要思想,都是从函数式编程语言借来的,还有从矢量编程语言借来的特性,它极大地方便了编程人员,使他们在不会分布式并行编程的情况下可以将自己的程序运行在分布式系统上。当前的软件实现是指定一个Map函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce函数,用来保证所有映射的键值对中的每一个共享相同的键值。