您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > Mongodb开发视频教程-第十讲(学云网配套源码)
学云签约讲师王泽Mongodb开发视频教程—第十讲Mongodb聚合操作学云为您提供高品质课件、学习督导服务、即时答疑、知识交易平台上节回顾•索引简介•创建唯一索引•explain使用方法•索引管理学云为您提供高品质课件、学习督导服务、即时答疑、知识交易平台本节目标•count使用•distinct使用•group使用•MapReduce使用count使用学云为您提供高品质课件、学习督导服务、即时答疑、知识交易平台•同关系型数据库一样,MongoDB同样也提供了对聚合函数的支持!并且因为其集合没有模式这种特殊性,MongoDB对聚合还有了更强大的支持。•集合的count函数是最简单的聚合函数,返回集合中文档的数量,也可以接受一个查询文档,统计符合这个查询的文档数量•db.user.count();•根据参数统计:db.user.count({name:tim});•不使用任何参数的count,不论集合有多大,都会很快返回结果!使用参数后,会让count函数执行变慢。distinct使用学云为您提供高品质课件、学习督导服务、即时答疑、知识交易平台•在MongdoDB中distinct用来找出给定键的所有不同的值,即是去重复,使用时,必须指定集合和键。•db.user.distinct(name);•db.runCommand({distinct:user,key:name});•命令接受的文档参数中,键distinct指定统计的集合名称,键key指定统计的键的名称!返回一个文档,键“value”指定统计的键在该集合中的所有值。group使用学云为您提供高品质课件、学习督导服务、即时答疑、知识交易平台•MongoDB中的group和mysql中的group分组差不多。•group做的聚合稍微复杂一些,先选定分组所依据的键,而后MongoDB就会将集合依据选定键值的不同分成若干组。然后可以通过聚合每一组内的文档,产生一个结果文档。•比如现在有这样一个集合,其中记录了所有蔬菜的价格并会定期刷新,我们要统计一下各个蔬菜的最新价格,即我们首先需要按照蔬菜名称进行分组,然后对每一组文档进行处理,找出最新的价格。group使用学云为您提供高品质课件、学习督导服务、即时答疑、知识交易平台•db.runCommand({•group:{•ns:refactor,•key:{username:true},•initial:{count:0},•$reduce:function(doc,prev)•{prev.count++;},•condition:{age:{$gt:40}}}})group使用学云为您提供高品质课件、学习督导服务、即时答疑、知识交易平台•ns:refactor,指定要进行分组的集合•key:{username:true},指定文档分组的依据,这里是username键,所有username键的值相等的被划分到一组,true为返回键username的值•initial:{count:0},每一组reduce函数调用的初始个数.每一组的所有成员都会使用这个累加器.•$reduce:function(doc,prev){...},每个文档都对应的调用一次.系统会传递两个参数:当前文档和累加器文档.•condition:{age:{$gt:40}},个age的值大于40的条件。MapReduce使用学云为您提供高品质课件、学习督导服务、即时答疑、知识交易平台•count,distinct,group能做的事情MapReduce都能做.它是一个可以轻松并行化到多个服务器的聚合方法.它会拆分问题,再将各个部分发送到不同机器上,让每台机器完成一部分.当所有机器都完成时候,再把结果汇集起来形成最终完整的结果。•MapReduce需要几个步骤:•1.映射,将操作映射到集合中的每个文档.这个操作要么什么都不做,要么产生一个键和n个值.•2.洗牌,按照键分组,并将产生的键值组成列表放到对应键中.•3.化简,把列表中的值化简成一个单值,这个值被返回.•4.重新洗牌,直到每个键的列表只有一个值为止,这个值就是最终结果.MapReduce使用学云为您提供高品质课件、学习督导服务、即时答疑、知识交易平台•例如:找出集合中所有的键•MongoDB没有模式,因此无法通过一个文档得知这个集合有多少个键,这里我们利用MapReduce来统计一个集合中键的个数和每个键出现的次数(这里没有考虑内嵌文档的键,可以通过调整map函数实现)。我们先看看我们需要统计的集合,每个文档中键都不一致。•定义映射环节(map)所需map函数:MapReduce使用学云为您提供高品质课件、学习督导服务、即时答疑、知识交易平台•map函数使用函数emit(系统提供)“返回”要处理的值,这里用emit将文档的某个键的计数返回({“count”:1})。我们这里需要为每个键单独计数,所以要为每个键分别调用一次emit。this代表目前进入map函数中的文档!•定义化简环节(reduce)所需reduce函数:•通过map函数会产生很多{count:1}这样的文档,且每一个与一个键关联!这种由一个或多个{“count”:1}文档组成的数组(由洗牌阶段生成),会传递给reduce函数,作为reduce函数的第二个参数!reduce函数要能够被反复调用,因此reduce函数返回的值必须可以作为其第二个参数的一个元素!MapReduce使用学云为您提供高品质课件、学习督导服务、即时答疑、知识交易平台•mr=db.runCommand({mapreduce:testcol,map:map,reduce:reduce,out:testcolColumns});•运行命令时,键“mapreduce”指定集合名称,键“map”指定映射函数,键“reduce”指定化简函数,“out”指定最后输出的集合名称!在我所使用2.0.6版本的MongoDB,键“out”必须指明MapReduce使用学云为您提供高品质课件、学习督导服务、即时答疑、知识交易平台•内嵌文档中各个键的含义:•1、“input”:在整个过程发送到“map”函数的文档个数,即“map”函数执行的次数•2、“emit”:在整个过程,“emit”函数执行的次数•3、“reduce”:在整个过程,“reduce”函数执行的次数•4、“output”:最终在目标集合中生成的文档数量学云为您提供高品质课件、学习督导服务、即时答疑、知识交易平台小结•count使用•distinct使用•group使用•MapReduce使用学云为您提供高品质课件、学习督导服务、即时答疑、知识交易平台作业•熟悉count、distinct和group使用•熟悉MapReduce使用
本文标题:Mongodb开发视频教程-第十讲(学云网配套源码)
链接地址:https://www.777doc.com/doc-7867126 .html