`

MongoDB 聚合group、aggregate、Map Reduce

阅读更多

一:group   分组统计

语法:

{

key:<>,          #统计的字段

cound:{}         #筛选条件

reduce:function(current,result){}   #对文档进行聚合的函数 current(分组统计过程中的一个文档),result(聚合结果文档)

initial:{}                          #初始化聚合结果文档(先于reduce执行)

finalize:function(){}               #reduce函数执行完之后,返回之前执行的函数。可以用来修改result的值

}

 

准备数据:

db.stu.insert({'name':'zhangsan',sex:'男',age:18});

db.stu.insert({'name':'lisi',sex:'男',age:22});

db.stu.insert({'name':'lucy',sex:'女',age:16});

db.stu.insert({'name':'lilei',sex:'男',age:17});

db.stu.insert({'name':'hanmeimei',sex:'女',age:17});

db.stu.insert({'name':'mayun',sex:'男',age:51});

db.stu.insert({'name':'tony',sex:'男',age:48});

db.stu.insert({'name':'dinglei',sex:'男',age:46});

db.stu.insert({'name':'dengzhiqi',sex:'女',age:33});

db.stu.insert({'name':'liuyifei',sex:'女',age:31});

db.stu.insert({'name':'zhangchaoyang',sex:'男',age:52});

db.stu.insert({'name':'zhangxiaolong',sex:'男',age:38});

db.stu.insert({'name':'panxiaoting',sex:'女',age:40});

db.stu.insert({'name':'dingjunhui',sex:'男',age:41});

db.stu.insert({'name':'yaoming',sex:'男',age:39});

db.stu.insert({'name':'gaoyuanyuan',sex:'女',age:37});

db.stu.insert({'name':'yangmi',sex:'女',age:35});

db.stu.insert({'name':'zhaowei',sex:'女',age:39});

db.stu.insert({'name':'shengteng',sex:'男',age:37});

db.stu.insert({'name':'mali',sex:'女',age:35});

 

根据性别分组统计学生数量

db.stu.group({

key:{sex:1},

cond:{},

initial:{num:0},

reduce:function(current,result){

result.num += 1;

}

});

 

按性别统计年龄大于30的总年纪数

db.stu.group({

key:{sex:1},

cond:{age:{$gt:30}},

initial:{sum:0},

reduce:function(current,result){

result.sum += current.age;

}

});

 

按性别显示最大的年龄

db.stu.group({

key:{sex:1},

cond:{},

initial:{max:0},

reduce:function(current,result){

if(current.age>result.max){

result.max = current.age;

}

}

});

 

按性别统计年龄大于30的平均年龄

db.stu.group({

key:{sex:1},

cond:{age:{$gt:30}},

initial:{sum:0,num:0},

reduce:function(current,result){

result.sum += current.age;

result.num += 1;  

},

finalize:function(result){

result.avg = result.sum/result.num;

});

 

官方文档:https://docs.mongodb.com/v2.6/reference/command/group/

注意:group 不支持分片集群,不能进行分布式运算。 

 

二:aggregate  简单聚合

语法:

 

 

准备数据:同group

 

根据性别分组统计学生数量

db.stu.aggregate([{$group:{_id:'$sex',total:{$sum:1}}}]);

 

根据性别分组统计年龄大于30的学生数量

db.stu.aggregate([{$match:{age:{$gt:30}}},

{$group:{_id:'$sex',total:{$sum:1}}}]);

 

 

根据性别分组统计年龄大于30,且总数大于7的学生数量

db.stu.aggregate([{$match:{age:{$gt:30}}},

{$group:{_id:'$sex',total:{$sum:1}}},

{$match:{total:{$gt:7}}}]);

 

按性别统计总年龄数

db.stu.aggregate([{$group:{_id:'$sex',total:{$sum:'$age'}}}]);

 

按性别统计总年龄数,且按年龄总数降序排序,且只取前一行数据

db.stu.aggregate([{$group:{_id:'$sex',total:{$sum:'$age'}}},

{$sort:{total:-1}},

{$limit:1}]);

 

 

按性别统计总年龄数,且按年龄总数降序排序

db.stu.aggregate([{$group:{_id:'$sex',total:{$sum:'$age'}}},

{$sort:{total:-1}}]);

 

 

按性别统计平均年龄,且从高到低排序

db.stu.aggregate([{$group:{_id:'$sex',avg:{$avg:'$age'}}},

{$sort:{avg:-1}}]);

 

 

官方文档:https://docs.mongodb.com/manual/reference/command/aggregate/index.html

     https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline

 

 

三:Map Reduce

#原始数据
db.orders.insert({cust_id:"A123",amount:500,status:"A"});
db.orders.insert({cust_id:"A123",amount:250,status:"A"});
db.orders.insert({cust_id:"B212",amount:200,status:"A"});
db.orders.insert({cust_id:"A123",amount:300,status:"D"});

 

#按照cust_id分组统计amount之 且只统计 status是A的
db.orders.mapReduce(
	function(){emit(this.cust_id,this.amount);},
	function(key,values){return Array.sum(values)},
	{
		query:{status:"A"},
		out:"orders_totals"
	}
)



 

 

 

注意:

1,Map 函数必须调用emit(key,value) 返回键值对。

2,Reduce 函数接受的参数已经按照键聚合过一次,将Map返回的键值序列组合成{key,[value1,value2,...,valuen]}传递给Reduce,Reduce函数对values统计。

 

 

 参考官网文档:https://docs.mongodb.com/manual/core/map-reduce

                          https://docs.mongodb.com/manual/reference/command/mapReduce/#dbcmd.mapReduce

  • 大小: 12.6 KB
  • 大小: 2.2 KB
  • 大小: 189.3 KB
分享到:
评论

相关推荐

    浅析mongodb中group分组

    MongoDB的`group`命令是数据聚合的一种方式,主要用于对数据进行分组并进行统计分析。在MongoDB中,当你需要根据某个字段的值来汇总数据时,`group`命令非常有用。以下是对MongoDB中`group`分组功能的详细解析: 1....

    Mongo-Commands:MongoDB命令速查表。 包含map-reduce,aggregate等

    以下是对MongoDB中`map-reduce`和`aggregate`两个重要功能的详细解释。 ### 1. Map-Reduce Map-Reduce是一种处理大数据的编程模型,常用于数据聚合。在MongoDB中,map-reduce用于执行复杂的分析任务,通过将数据...

    Mongo聚合助手类似于lodash实用程序

    "Mongo聚合助手类似于lodash实用程序"这个标题暗示了一个专门针对MongoDB聚合操作的工具或模块,它可能模仿了lodash的接口和风格,使得开发者可以更方便地进行数据处理。 在JavaScript开发中,lodash的便捷性在于其...

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

    4. **mapReduce**:这是一个更复杂的聚合操作,它结合了映射(map)和减少(reduce)函数,适用于更复杂的分布式计算场景。`map`函数用于遍历所有文档并使用`emit`将数据映射到键值对,而`reduce`函数则负责合并相同键的...

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

    在MongoDB中,它包括创建Map函数和Reduce函数,然后将它们应用于数据集。Map函数遍历数据,将每个文档映射成键值对,而Reduce函数则对相同键的值进行聚合。 例如,下面展示了如何使用MapReduce统计不同部门和职位...

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

    MongoDB 的 mapReduce 功能允许用户自定义 `map` 函数(用于映射数据)和 `reduce` 函数(用于聚合数据),并在多台机器上并行执行,非常适合处理大量数据和执行复杂聚合任务。mapReduce 的优点在于其强大的计算能力...

    MongoDB使用手册

    - `db.collection.aggregate([{ $match: { condition } }, { $group: { _id: "$field", total: { $sum: "$amount" } } }])`: 执行聚合操作,过滤并计算汇总信息。 **3.2 使用客户端操作MongoDB** - **3.2.1 ...

Global site tag (gtag.js) - Google Analytics