MongoDB中强大的聚合工具

1.count

count返回集合中的文档数量

&">nbsp;

db.refactor.count() 

不管集合有多大,都能很快的返回文档数量.

可以传递查询,MongoDB会计算查询结果的数量

db.refactor.count({"username":"refactor"}) 

但是增加查询条件会使count变慢.

2.distinct

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

如:

db.runCommand({"distinct":"refactor","key":"username"})

3.group

group先选定分组所依据的键,MongoDB将会将集合依据选定键值的不同分成若干组.然后可以通过聚合每一组内的文档,

产生一个结果文档.

如:

db.runCommand( { "group": { "ns":"refactor", "key":{"username":true}, "initial":{"count":0}, "$reduce":
function(doc,prev) { prev.count++; }, "condition":{"age":{"$gt":40}} } } ) 

"ns":"refactor",

指定要进行分组的集合
    "key":{"username":true},

指定文档分组的依据,这里是username键,所有username键的值相等的被划分到一组,true为返回键username的值
    "initial":{"count":0},

每一组reduce函数调用的初始个数.每一组的所有成员都会使用这个累加器.
    "$reduce":function(doc,prev){...}

每个文档都对应的调用一次.系统会传递两个参数:当前文档和累加器文档.

"condition":{"age":{"$gt":40}} 

这个age的值大于40的条件

4.使用完成器

完成器用于精简从数据库传到用户的数据.group命令的输出一定要能放在单个数据库相应中.

"finalize"附带一个函数,在数组结果传递到客户端之前被调用一次.

db.runCommand( { "group": { "ns":"refactor", "key":{"username":true}, "initial":{"count":0}, "$reduce":function(doc,prev) { prev.count++; }, "finalize":function(doc) { doc.num=doc.count; delete doc.count; } } } ) 

finalize能修改传递的参数也能返回新值.

5.将数组作为键使用

有些时候分组所依据的条件很复杂,不仅是一个键.比如要使用group计算每个类别有多篇博客文章.由于有很多作者,

给文章分类时可能不规律的使用了大小写.所以,如果要是按类别名来分组,最后"MongoDB"和"mongodb"就是不同的组.

为了消除这种大小写的影响,就要定义一个函数来确定文档所依据的键.

定义分组要用到$keyf

db.runCommand(  {   "group":    {     "ns":"refactor",     "$keyf":function(doc){return {"username":doc.username.toLowerCase()}},     "initial":{"count":0},     "$reduce":function(doc,prev)        {         prev.count++;        }    }  } ) 

6.MapReduce

count,distinct,group能做的事情MapReduce都能做.它是一个可以轻松并行化到多个服务器的聚合方法.它会

拆分问题,再将各个部分发送到不同机器上,让每台机器完成一部分.当所有机器都完成时候,再把结果汇集起来形成

最终完整的结果.

MapReduce需要几个步骤:

1.映射,将操作映射到集合中的每个文档.这个操作要么什么都不做,要么 产生一个键和n个值.

2.洗牌,按照键分组,并将产生的键值组成列表放到对应键中.

3.化简,把列表中的值 化简 成一个单值,这个值被返回.

4.重新洗牌,直到每个键的列表只有一个值为止,这个值就是最终结果.

MapReduce的速度比group慢,group也很慢.在应用程序中,最好不要用MapReduce,可以在后台运行MapReduce

创建一个保存结果的集合,可以对这个集合进行实时查询.

找出集合中的所有键

MongoDB没有模式,所以并不知晓每个文档有多少个键.通常找到集合的所有键的做好方式是用MapReduce.

在映射阶段,想得到文档中的每个键.map函数使用emit 返回要处理的值.emit会给MapReduce一个键和一个值.

这里用emit将文档某个键的记数(count)返回({count:1}).我们为每个键单独记数,所以为文档中的每一个键调用一次emit,

this是当前文档的引用:

map=function(){ for(var key in this) { emit(key,{count:1}) } }; 

这样返回了许许多多的{count:1}文档,每一个都与集合中的一个键相关.这种有一个或多个{count:1}文档组成的数组,

会传递给reduce函数.reduce函数有两个参数,一个是key,也就是emit返回的第一个值,另一个参数是数组,由一个或者多个

对应键的{count:1}文档组成.

reduce=function(key,emits){ total=0; for(var i in emits){ total+=emits[i].count;  } return {count:total}; } 

reduce要能被反复被调用,不论是映射环节还是前一个化简环节.reduce返回的文档必须能作为reduce的

第二个参数的一个元素.如x键映射到了3个文档{"count":1,id:1},{"count":1,id:2},{"count":1,id:3}

其中id键用于区别.MongoDB可能这样调用reduce:

>r1=reduce("x",[{"count":1,id:1},{"count":1,id:2}]) {count:2} >r2=reduce("x",[{"count":1,id:3}]) {count:1} >reduce("x",[r1,r2]) {count:3}

reduce应该能处理emit文档和其他reduce结果的各种集合.

如:

mr=db.runCommand( { "mapreduce":"refactor", "map":map, "reduce":reduce, "out":{inline:1} } ) 

或:

db.refactor.mapReduce(map,reduce,{out:{inline:1}})

"timeMillis" : 5,//操作花费的时间
"counts" : {
"input" : 10,//发往到map函数的文档个数
"emit" : 40,//在map函数中emit被调用的次数
"reduce" : 4,//在map函数中reduce被调用的次数
"output" : 4//结果集合中创建的文档数量.
},

1.mapreduce是根据map函数里调用的emit函数的第一个参数来进行分组的

2.仅当根据分组键分组后一个键匹配多个文档,才会将key和文档集合交由reduce函数处理

注意MongoDB 1.8版本以上,必须指明 out 参数

否则会报如下错误:

"assertion" : "'out' has to be a string or an object",
"assertionCode" : 13606,

MapReduce中的其他键

mapreduce,map,reduce这三个键是必须的,MapReduce命令还有其他的可选键

finalize:函数

将reduce的结果发送给这个键,这是处理过程的最后一步

keeptemp:布尔值

连接关闭时,临时结果是否保存

output:字符串

结果集合的名字,设定该项则隐含着keeptemp:true

query:文档

会在发往map函数前,先用指定条件过滤文档

sort:文档

会在发往map函数前先给文档排序

limit:整数

发往map函数文档的最大数量

scope:文档

javascript代码中要用到的变量

verbose:布尔值

是否产生更加信息的服务器日志

时间: 2024-09-19 20:38:27

MongoDB中强大的聚合工具的相关文章

MongoDB中强大的统计框架Aggregation使用实例解析_MongoDB

听说项目里面Aggregation用的多,那就专门针对这个多多练习一下. 基本的操作包括: •$project - 可以从子文档中提取字段,可以重命名字段 •$match - 可以实现查找的功能 •$limit - 接受一个数字n,返回结果集中的前n个文档. •$skip - 接受一个数字n,丢弃结果集中的前n个文档.效率比较低,依然会遍历前n个文档. •$unwind - 可以将一个包含数组的文档切分成多个, 比如你的文档有 中有个数组字段 A, A中有10个元素, 那么经过 $unwind处

Mongodb中MapReduce实现数据聚合方法详解_MongoDB

Mongodb是针对大数据量环境下诞生的用于保存大数据量的非关系型数据库,针对大量的数据,如何进行统计操作至关重要,那么如何从Mongodb中统计一些数据呢? 在Mongodb中,给我们提供了三种用于数据聚合的方式: (1)简单的用户聚合函数: (2)使用aggregate进行统计: (3)使用mapReduce进行统计: 今天我们首先来讲讲mapReduce是如何统计,在后续的文章中,将另起文章进行相关说明. MapReduce是啥呢?以我的理解,其实就是对集合中的各个满足条件的文档进行预处理

Hadoop如何通过对数据仓库进行补充来创建强大的聚合平台

Apache Hadoop 是新一代数据仓库的基础.各公司纷纷采用 Hadoop 作为其当前仓储架构(如提取/转换/加载 (ETL).数据暂存和非结构化内容预处理)中的战略角色.我也将 Hadoop 视为云中新一代大规模并行数据仓库中的一项关键技术,Hadoop 对当今的仓储技术和低延迟流平台进行了有效补充. 在 IBM,我们期待在未来的几年里,Hadoop 和数据仓库技术能够更加完善地相互融合并汇成一个全新的平台范例:Hadoop 数据仓库.Hadoop 没有展示陈旧的传统仓储架构:相反,它将

MongoDB入门教程之聚合和游标操作介绍_MongoDB

 今天跟大家分享一下mongodb中比较好玩的知识,主要包括:聚合,游标. 一: 聚合       常见的聚合操作跟sql server一样,有:count,distinct,group,mapReduce. <1> count         count是最简单,最容易,也是最常用的聚合工具,它的使用跟我们C#里面的count使用简直一模一样.  <2> distinct        这个操作相信大家也是非常熟悉的,指定了谁,谁就不能重复,直接上图.  <3> gr

什么是Blog? 什么是RSS?新闻聚合工具

rss|rss 什么是Blog? 什么是RSS?新闻聚合工具 arron 发表于 2004-6-7 1:08:13 什么是Blog? - Blog,是Weblog的简称.- Weblog,是Web 和Log的组合词.Web,指World Wide Web:Log,原义是"航海日志",后指任何类型的流水记录.Weblog 是在网络上的一种流水记录形式.- Blogger或Weblogger,是指习惯于日常记录并使用Weblog工具的人. -------------------------

8种方法让Android成为强大的生产力工具

本文讲的是8种方法让Android成为强大的生产力工具,据海外公司调查显示,安卓(Android)系统目前在商用智能手机市场的占有率持续走高,2017年一季度占到全球企业采购率三分之二以上.尽管如此,安卓手机在提高生产效率方面还有提升空间. 启动一部时下流行的安卓机,你会发现低效的主屏幕,设计平庸的键盘和许多未开发的功能.其实你只需要对一些功能进行微调,就能让你的安卓手机生产效率大幅提高,为商务工作做好准备.那么,按照下面的八个步骤来吧. 1.优化主屏幕 主屏幕是所有手机功能集成的体现,所以设置

10个商业活动中需要的数据分析工具

虽然收集和分析"大数据"存在一些分析和技术方面的挑战,但事实上大部分公司已经能够应对这种挑战.这是因为有一些非常强大的分析工具都是免费.开源的,可以充分利用这些工具来提升自己的能力. Alex Jones推荐了10个针对企业的大数据分析工具,这些工具不仅免费.使用方便,而且具有强大的功能和良好的资源. 1.Tableau Public 这是一个简单直观的可视化工具.它在商业活动中表现的很强大,因为它通过可视化来表达.它有足够的空间和免费使用时长让你体验,在分析的过程中,Tableau的

jquery jqPlot API 中文使用教程(非常强大的图表工具)_jquery

jqPlot是一个非常强大的图表工具,曲线,柱状,饼图,应该有尽有,更要命的是,调用方便~~ 官网:http://www.jqplot.com/ 这里贡献上中文教程,基本上所有的api都很齐全,供有需要的童鞋们瞧瞧,更重要的是作为自己滴收藏~~哦耶耶~ jqPlot整的来说有三个地方需要配置.格式如: $.jqplot('target', data, options);target:要显示的位置.data:显示的数据.options:其它配置 seriesColors: [ "#4bb2c5&q

如何将苹果iPad变成强大的办公工具

苹果iPad自上市以来受到了消费者的追捧,然而也有人指出iPad只是一个高级的玩具,那么如何将iPad变得更加实用,让其成为强大的办公工具呢?知名虚拟化解决方案供应商VMware表示,实用VMwarehttp://www.aliyun.com/zixun/aggregation/13887.html">虚拟桌面解决方案就可以实现这一目标. 视频地址:http://static.youku.com/v1.0.0131/v/swf/qplayer.swf?VideoIDS=XMjIxNDEyN