//函数准备: > function map(){ emit(this.name,{count:1}); } > function reduce(key,value){ var result = {count:0}; for(var i=0;i<value.length;i++){ result.count += value[i].count; } result.ext = "haha"; return result; } //例子1-1: > db.person.find() { "_id" : ObjectId("566e89f8382a8419511d02ab"), "name" : "hxc", "age" : 20 } { "_id" : ObjectId("566e8a0c382a8419511d02ac"), "name" : "hxc", "age" : 24 } { "_id" : ObjectId("566e8a1c382a8419511d02ad"), "name" : "zjl", "age" : 34 } { "_id" : ObjectId("566e8a1c382a8419511d02ad"), "name" : "zjl", "age" : 26 } { "_id" : ObjectId("566e8a32382a8419511d02ae"), "name" : "xx", "age" : 32 } { "_id" : ObjectId("566e8a42382a8419511d02af"), "name" : "abcdweb", "age" : 32 } { "_id" : ObjectId("566e8a52382a8419511d02b0"), "name" : "abcdweb", "age" : 32 } { "_id" : ObjectId("566e8a5f382a8419511d02b1"), "name" : "xx", "age" : 32 } > db.person.mapReduce(map,reduce,{"out":"collection"}) { "result" : "collection", "timeMillis" : 285, "counts" : { "input" : 8, "emit" : 8, "reduce" : 4, //此值为4 "output" : 4 }, "ok" : 1 } > db.collection.find() { "_id" : "abcdweb", "value" : { "count" : 2, "ext" : "haha" } } { "_id" : "hxc", "value" : { "count" : 2, "ext" : "haha" } } { "_id" : "xx", "value" : { "count" : 2, "ext" : "haha" } } { "_id" : "zjl", "value" : { "count" : 2, "ext" : "haha" } } //例子1-2: > db.person.find() { "_id" : ObjectId("566e8a1c382a8419511d02ad"), "name" : "zjl", "age" : 34 } { "_id" : ObjectId("566e8a32382a8419511d02ae"), "name" : "xx", "age" : 32 } { "_id" : ObjectId("566e8a5f382a8419511d02b1"), "name" : "xx", "age" : 32 } { "_id" : ObjectId("566e8fdd382a8419511d02b2"), "name" : "zjl", "age" : 26 } { "_id" : ObjectId("566e90a4382a8419511d02b3"), "name" : "hxc", "age" : 20 } { "_id" : ObjectId("566e90bd382a8419511d02b4"), "name" : "abcdweb", "age" : 32 } > db.person.mapReduce(map,reduce,{"out":"collection"}) { "result" : "collection", "timeMillis" : 271, "counts" : { "input" : 6, "emit" : 6, "reduce" : 2, //此值为2 "output" : 4 }, "ok" : 1 } > db.collection.find() //留意,首两行记录没有“ext”字段,表明该两组并没有执行reduce函数;value为emit的value { "_id" : "abcdweb", "value" : { "count" : 1 } } { "_id" : "hxc", "value" : { "count" : 1 } } { "_id" : "xx", "value" : { "count" : 2, "ext" : "haha" } } { "_id" : "zjl", "value" : { "count" : 2, "ext" : "haha" } } > 总结:map是拿来分组的,具体实现通过emit,emit的key则为分组字段,其value的集合(即数组)会传给reduce函数执行,若value集合长度小于2,则该分组不会传到reduce函数执行(因为reduce的字面意思是“简化”,是将集合数据进行精简,统计获取一个结果;而若集合只有一条数据,根本就不需要统计了)
更多用法,参考:
Aggregate
db.article.aggregate( { $project : { title : 1, doctoredPageViews : { $add: ["$pageViews", 10] } //留意:$add后面是中括号 }}); { $project : { title : 1 , page_views : "$pageViews" , bar : "$other.foo" }} //注意操作符的顺序 db.user.aggregate( [ { $group: { _id: "$User", totalCount: {$sum: "$Count"} } }, { $project : { _id: 0, name : "$_id", totalCount: "$totalCount" } } ] ); //以多个字段分组要这样写 db.user.aggregate( { $group : { _id : { "MyUser": "$User" , "Country":"$Country" }, TotalCount : { $sum : "$Count" } } } ); ------------------------------------------------------------------------- 数据准备: { "_id" : ObjectId("56cd0e8b8b04c3250840e364"), "title" : "MongoDB Overview", "description" : "MongoDB is no sql database", "by_user" : "w3cschool.cc", "url" : "http://www.w3cschool.cc", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : NumberInt(100) } { "_id" : ObjectId("56cd0e8b8b04c3250840e365"), "title" : "NoSQL Overview", "description" : "No sql database is very fast", "by_user" : "w3cschool.cc", "url" : "http://www.w3cschool.cc", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : NumberInt(10) } { "_id" : ObjectId("56cd0e8b8b04c3250840e366"), "title" : "Neo4j Overview", "description" : "Neo4j is no sql database", "by_user" : "Neo4j", "url" : "http://www.neo4j.com", "tags" : [ "neo4j", "database", "NoSQL" ], "likes" : NumberInt(750) } { "_id" : ObjectId("56cd20c08b04c3250840e367"), "title" : "Java Overview", "description" : "Java Coder", "by_user" : "w3cschool.cc", "url" : "http://www.java.com", "tags" : [ "javase", "javaee", "spring" ], "likes" : NumberInt(300) } //这些操作符都是可以用多次的 db.author.aggregate([ { $group: { _id: "$by_user", count: {$sum: "$likes"} } }, { $project: { cnt: {$cond: {if: {$gte: ['$count', 500]}, then: 'a', else: 'b'}} } }, { $project: { cnt: '$cnt', cs: {$cond: {if: {$eq: ['$cnt', 'a']}, then: '1', else: '2'}} } } ]); //分组可以根据条件分 db.author.aggregate([ { $group: { _id: { $cond: { if: {$gte: ['$likes', 150]}, then: 'a', else: 'b' } }, count: {$sum: "$likes"} } } ]); 例子:多个区间分组 db.author.aggregate([ { $group: { _id: { $cond: { if: {$lte: ['$likes', 110]}, then: '<=110', else: '$likes' } }, count: {$sum: 1} } }, { $group: { _id: { $cond: { if: {$lte: ['$_id', 750]}, then: '>110 and <=750', else: '$_id' } }, count: {$sum: '$count'} } } ]); output: { "_id" : "<=110", "count" : 2 } { "_id" : ">110 and <=750", "count" : 2 } ------------------------------------------------------------------------- mapreduce例子: var map = function() { emit(this.carrier_name, {count:1});}; var reduce = function(key, values) { var total = 0; for(var i=0;i<values.length;i++){total += values[i].count;} return {count:total};}; var final = function(key, values){ return { "name": key, "num": values.count }; }; db.http_details.mapReduce(map, reduce, {"query": {"carrier_name": {$ne: "中国电信"}}, "out": "tempStat", "finalize": final, "keeptemp": false}); { "_id" : "CHINA MOBILE", "value" : { "name" : "CHINA MOBILE", "num" : 1364.0 } } { "_id" : "CHN-UNICOM", "value" : { "name" : "CHN-UNICOM", "num" : 1975.0 } } { "_id" : "unknown", "value" : { "name" : "unknown", "num" : 15498.0 } } { "_id" : "中国移动", "value" : { "name" : "中国移动", "num" : 7711.0 } } { "_id" : "中国联通", "value" : { "name" : "中国联通", "num" : 9069.0 } }
相关推荐
mongodb group aggregate项目实战笔记 管道聚合 mongodb group按时间分组,用aggregate管道聚合 会比group的处理效率要高而且更灵活方便
mongodb mapreduce 实例,该例子主要用来做订单统计的。具体问题请到博客提问。
NULL 博文链接:https://superhuo.iteye.com/blog/1193485
MongoDB MapReduce MapReduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。这样做的好处是可以在任务被分解后,可以通过大量机器进行并行计算,减少...
Mongodb是针对大数据量环境下诞生的用于保存大数据量的非关系型数据库,针对大量的数据。接下来通过本文给大家介绍Mongodb中MapReduce实现数据聚合方法详解,感兴趣的朋友一起学习吧
MapReduce应该算是MongoDB操作中比较复杂的了,下面这篇文章主要给大家介绍了关于MongoDB中MapReduce使用的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起看看吧。
MongoDB的MapReduce.pdf 学习资料 复习资料 教学资源
主要介绍了使用aggregate在MongoDB中查询重复数据记录的方法的相关资料,需要的朋友可以参考下
最近一直在用mongodb,有时候会需要用到统计,在网上查了一些资料,最适合用的就是用aggregate,以下介绍一下自己运用的心得。。 MongoDB 聚合 MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),...
1.分篇章进行学习,内容控制30分钟内 2.1个月疗程,不要放弃治疗哦 3.图文并茂,有问题请发到邮箱
我的博客:www.wangs0622.com, mongoDB-aggregate pipeline 使用的文档集合。
计算机后端-PHP视频教程. mongodb10 MapReduce 统计栏目下的商品.wmv
本文实例讲述了nodejs+mongodb aggregate级联查询操作。分享给大家供大家参考,具体如下: 最近完成了一个nodejs+mongoose的项目,碰到了mongodb的级联查询操作。情形是实现一个排行榜,查看某个公司(organization...
一个简单的Mongodb mapreduce的例子
php代码-mongodb aggregate sample 的使用
计算机后端-PHP视频教程. mongodb08 导出导入.wmv
db.COLLECTION_NAME.aggregate() 方法用来构建和使用聚合管道,下图是官网给的实例,可以看出来聚合管道的用法还是比较简单的。 2. MongoDB Aggregation 管道操作符与表达式 常用的管道操作符有以下这些: ...