6 聚合

count

最简单的聚合工具,返回集合中的文档数量,速度非常快。

>db.coll.count()

计算查询条件为namexiaozhe的总数,有条件的查询速度会变慢。

>db.coll.count({"name":"xiaozhe"})

distinct

用来找出给定键的所有不同值,使用时必须指定集合和键。

>db.runCommand({"distinct":"coll","key":"age"})

group

先选定分组所依据的键,而后MongoDB就会将集合依据选定键值的不同分成若干组。然后可以通过聚合每一组内的文档,产生一个结果文档。类似sql中的GroupBy

例子:现在我们需要从下面文档得到最近30每天最后时刻(time)的价格

MongoDB<wbr></p>6<wbr>聚合


我们先将集合按照天分组,然后在每一组里取包含最新时间戳的文档,将其放置到结果中就完成了。

>db.runCommand({"group":{

"ns":"stocks",

"key":"day",255); font-size:10.5000pt; font-family:'宋体'">"initial":{"time":0},255); font-size:10.5000pt; font-family:'宋体'">"$reduce":function(doc,prev){

if(doc.time>prev.time){

prev.price=doc.price;

prve.time=doc.time;

}

},255); font-size:10.5000pt; font-family:'宋体'">"condition":{"day":{"$gt":"2010/09/30"}}

}})

现在我们分解上面的命令:

"ns":"stocks" #指定要进行分组的集合

"key":"day" #指定文档分组的键,所有day值相同的划分到一组

"initial":{"time":0} #每一组reduce函数调用的初始时间,会作为初始文档传递给后续过程。每一组的所有成员都会使用这个累加器,所以改变会保留住。

#每个文档都对应这一次调用,系统会传递2个参数:当前文档和累加器文档(本组当前的结果)。本例中,想让reduce函数比较当前文档的时间和累加器的时间。

"condition":{"day":{"$gt":"2010/09/30"}} #分组的条件,有些资料提及condq,其实和condition键是一样的意思。

finalize

完成器可以精简从数据库传到用户的数据,这个步骤非常重要,因为group命令的输出一定要放在单个数据库响应中。

具体实例:PAGE~102

函数做为键使用

有时候分组的依据条件非常复杂,不仅仅是一个键。比如要计算有多少篇不同类别的文章,但是由于作者建立类别的时候大小写不注意。造成两种不同的结果,为了消除这种影响,我们需要定义一个函数来确定文档分组依据的键。

注意:定义分组函数就要用到$keyf(注意不是$key)

>db.coll.group({

"ns":"coll",

"$keyf":function(x){

Returnx.category.toLowerCase();

},

...

})

MapReduce

PAGE~104

MapReduce是聚合工具中的明星。Countdistinct,group能做的上述事情MapReduce都能做。它是一个可以轻松并行化到多个服务器的聚合,它会拆分问题,再将各个部分发送到不同的的机器上,让每个机器完成一部分,当所有机器都完成的时候,再把结果汇总形成最终结果。

相关文章

适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独立于使用算法...
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,它是针对软件开发中经常遇到的一些设计问题...
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结...
迭代器模式提供了一种方法,用于遍历集合对象中的元素,而又不暴露其内部的细节。
外观模式又叫门面模式,它提供了一个统一的(高层)接口,用来访问子系统中的一群接口,使得子系统更容...