`

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 aggregate项目实战笔记

    ### MongoDB Group Aggregate 实战解析 #### 一、项目背景与目的 在数据分析领域,特别是针对时间序列数据的处理,MongoDB 提供了强大的查询和聚合功能。本实战笔记旨在通过一个具体的案例,来探讨如何利用 MongoDB...

    11、MongoDB聚合操作及索引使用详解-ev.rar

    11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar...

    MongoDB 聚合管道(Aggregation Pipeline)

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

    Mongodb聚合

    ### MongoDB 聚合框架详解 #### 概述 MongoDB 的聚合框架是数据库系统中一个强大而灵活的功能,用于处理复杂的数据分析需求。通过一系列的管道操作(pipeline stages),可以实现对数据集进行筛选、分组、计算等...

    MongoDB聚合操作详细步骤.pdf

    MongoDB中的聚合框架是一个强大且灵活的数据处理工具,它允许用户对存储在数据库中的数据执行各种操作,从简单的数据聚合到复杂的文本处理和数组操作等。 聚合框架的主要组成部分是管道(pipeline),它由多个处理...

    meteor-aggregate, 对 Meteor的适当的MongoDB聚合支持.zip

    meteor-aggregate, 对 Meteor的适当的MongoDB聚合支持 meteorhacks:aggregate为 Meteor 添加适当聚合支持的简单软件包。 这个包在 Mongo.Collection 实例上公开了 .aggregate 方法。这只在服务器端工作,没有...

    MongoDB聚合实战:数据分析与财务应用轻松入门

    读者将学习到聚合管道的概念,以及如何使用各种操作符(如 `$match`、`$group`、`$sort` 等)来过滤、投影、排序和处理数据。这部分内容还包括聚合管道的执行顺序,帮助读者理解数据是如何在管道中流动并被逐步处理...

    MongoDB之聚合aggregate操作

    关于mongodb的高级操作,包括聚合、主从复制、分片、备份与恢复、MR。 一、聚合 aggregate 聚合(aggregate)主要用于计算数据,类似sql中的sum()、avg() 语法: db.集合名称.aggregate([{管道:{表达式}}]) 管道:...

    MongoDB教程之聚合(count、distinct和group)

    在本教程中,我们将深入探讨MongoDB中的三个关键聚合操作:`count`、`distinct`和`group`。 1. `count` 函数: `count` 方法用于计算集合中符合特定条件的文档数量。在MongoDB中,你可以直接调用`db.collection....

    MongoDB 高级查询 aggregate 聚合管道

    db.COLLECTION_NAME.aggregate() 方法用来构建和使用聚合管道,下图是官网给的实例,可以看出来聚合管道的用法还是比较简单的。   2. MongoDB Aggregation 管道操作符与表达式 常用的管道操作符有以下这些: ...

    spring data mongodb 聚合 管道

    首先,我们需要理解MongoDB的聚合框架,它包括一系列的阶段,每个阶段都是一个操作,如`$match`、`$group`、`$sort`和`$project`等。这些阶段可以组合成一个“管道”(pipeline),数据会按照这个管道中的顺序依次...

    JAVA mongodb 聚合几种查询方式详解

    AggregationOutput Output = mongoTemplate.getCollection("collectionName").aggregate(Match, Group); ``` 读取查询结果 遍历查询结果,例如: ```java Iterable&lt;DBObject&gt; map = Output.results(); for ...

    使用aggregate在MongoDB中查询重复数据记录的方法

    在MongoDB中,`db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)`命令用于对特定集合执行一系列聚合管道操作。每个操作(pipe)通常接收上一步的输出作为输入,并产生新的输出,直到最后一个操作返回最终结果。 ...

    mongodb聚合学习使用文档.txt

    mongodb聚合学习使用文档

    MongoDB aggregate 运用篇个人总结

    MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。 aggregate() 方法 MongoDB中聚合的方法使用aggregate()。 语法 aggregate() 方法的...

    MongoDB的高级查询aggregate聚合管道1

    在MongoDB中,聚合管道通过`db.COLLECTION_NAME.aggregate([...])`方法来实现。 一、MongoDB聚合管道(Aggregation Pipeline) 聚合管道由多个阶段组成,每个阶段都会接收上一阶段处理后的结果,并对其进行进一步的...

    MapReduceMongoDB:在 MongoDB 中使用 Map reduce

    标题:在 MongoDB 中使用 Map Reduce 检查波兰语和英语句子中的字母分布 动机 我们越来越多地听到各种网站遭到攻击以及密码非常薄弱的​​管理员的不负责任。 如何创建一个强密码:有一种观点认为你应该造一个句子,...

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

    在处理大量数据时,聚合框架(Aggregation Framework)是MongoDB提供的一种强大的工具,用于对数据进行处理、分析和汇总。在这个场景中,我们需要从`mt_resources_access_log`集合中按`refererDomain`字段分组,并在...

    深入解析MongoDB聚合与索引:提升数据库效能的关键策略

    聚合是MongoDB中处理数据的一种方式,允许用户对集合中的数据进行分析和计算,类似于SQL中的GROUP BY操作。聚合框架包括多个阶段,如`$match`(过滤数据)、`$group`(分组数据)、`$sort`(排序数据)、`$project`...

Global site tag (gtag.js) - Google Analytics