`

mongodb mapReduce aggregate

阅读更多
//函数准备:
> 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的字面意思是“简化”,是将集合数据进行精简,统计获取一个结果;而若集合只有一条数据,根本就不需要统计了)

 

更多用法,参考:

MongoDB:MapReduce基础及实例

MongoDB MapReduce学习笔记

 

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 聚合管道(Aggregation Pipeline)

分享到:
评论

相关推荐

    MongoDB 聚合管道(Aggregation Pipeline)

    MongoDB的聚合操作可以使用命令行、驱动程序或MongoDB Shell中的aggregate()函数来执行。在聚合函数中,可以链式调用多个阶段操作符,形成一个完整的聚合管道。 值得一提的是,张善友在其博客中对MongoDB聚合管道...

    MongoDB期末考试测试题

    `aggregate`命令用于执行聚合管道操作,例如统计不同专业学生的最大年龄。 这些题目覆盖了MongoDB的关键功能,如数据插入、查询、更新、删除以及数据处理。通过解答这些问题,学生可以全面了解MongoDB的操作,并为...

    springmvc4.0+mongodb3.0 demo

    本项目以spring4.0+mongodb3.0为基础开发简易demo,对mongodb进行权限认证,简单增删改查,mapreduce,aggregate操作简单演示,java项目,非maven项目,使用之前先配好mongodb及其修改mongodb.properties里参数。

    mongodb教程

    虽然MongoDB的聚合框架在很多场景下更高效,但它仍然支持MapReduce,这是一种分布式计算模型,可用于处理大规模数据并生成汇总结果。 9. GridFS MongoDB 的GridFS是一个文件存储系统,用于存储和检索大于16MB的大...

    mongodb数据库的学习与总结

    - MongoDB还支持聚合操作,通过`aggregate()`函数进行数据统计和分析。 6. 高级特性: - MapReduce:用于大数据处理,通过定义映射和规约函数执行分布式计算。 - GridFS:用于存储大文件,将文件分割成多个块并...

    mongodb-2.4 api

    - `db.collection.aggregate()`: 使用聚合管道处理数据,进行复杂的数据分析。 8. MapReduce: - `db.collection.mapReduce(mapFunction, reduceFunction, outputOptions)`: 执行MapReduce操作,用于大数据处理。...

    第二课:MongoDB企业级应用操作1

    在本课“第二课:MongoDB企业级应用操作1”中,我们将探讨两个关键的聚合操作:pipeline 聚合和 mapReduce 聚合,这些都是在处理大数据和进行复杂分析时的重要工具。 首先,我们来看**pipeline 聚合**。MongoDB 的...

    MongoDB简单聚合函数.pdf

    然而,`group`操作在某些版本的MongoDB中可能已被`aggregate`管道取代,因为`aggregate`提供了更强大的聚合功能。 4. **MapReduce**: MapReduce是一种分布式计算模型,常用于处理和生成大数据集。在MongoDB中,...

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

    MongoDB 是一个流行的开源文档数据库系统,以其灵活性和高性能而受到开发者欢迎。在MongoDB中,聚合和游标是两种非常重要的高级操作,对于数据处理和分析尤其关键。 **一、聚合操作** 聚合操作允许用户对数据库中...

    第二课:mongodb企业级应用管理1

    在MongoDB中,聚合有两种主要形式:Pipeline聚合和MapReduce聚合。 1. Pipeline聚合: - `$match`:用于过滤输入文档,只保留满足特定条件的文档。 - `$project`:用于选择要包含在输出文档中的字段,以及转换...

    第一课:mongoDb快速入手1

    此外,MongoDB 还支持复杂查询和聚合操作,例如 `aggregate` 函数可以实现类似 SQL 的 GROUP BY 功能,通过管道(pipeline)处理数据。`mapReduce` 则用于进行数据映射和归约,适用于大规模数据分析。 在实际应用中...

    MongoDB使用手册

    MongoDB实现了MapReduce框架,允许用户定义Map函数和Reduce函数来处理数据。 - **Map函数:** 接收输入文档,生成键值对。 - **Reduce函数:** 处理键值对,生成汇总结果。 以上是对MongoDB使用手册的详细知识点总结...

    MongoDB在视频行业的应用实践.pptx

    主节点和候选节点提供高优先级的访问服务,非候选节点则用于低优先级的运营分析操作,如aggregate和mapreduce,实现了在线业务和运营分析的并行处理。这种架构不仅优化了资源利用率,还保证了服务质量。 总的来说,...

    MongoDB在视频行业的应用实践.pdf

    在运维管理方面,MongoDB的分布式架构允许咪咕视讯实现读写分离,主节点和候选节点负责在线业务,非候选节点则用于运营分析,如aggregate和mapreduce操作。这种架构不仅确保了在线服务的稳定性和性能,还满足了后台...

    MongoDB常用命令

    4. `db.collection.explain()`: 返回关于以下方法的查询计划的信息:aggregate()、count()、find()、remove()、update()、distinct()、findAndModify()、mapReduce()。 5. `db.collection.getShardDistribution()`: ...

    MongoDB聚合分组取第一条记录的案例与实现方法

    对于大数据集,考虑优化数据结构、索引设计以及使用更高效的处理方式(如MapReduce或在应用程序层面处理)可能会更合适。 总结起来,MongoDB的聚合框架在处理复杂的数据分析任务时提供了强大功能,但在这个特定场景...

    浅析mongodb中group分组

    MongoDB的`group`命令是数据聚合的一种方式,...然而,对于复杂的数据分析任务,可能需要结合使用`aggregate`命令或MapReduce,它们提供了更多的灵活性和处理能力。在实际应用中,应根据具体需求选择合适的聚合方法。

Global site tag (gtag.js) - Google Analytics