一: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
相关推荐
mongodb group aggregate项目实战笔记 管道聚合 mongodb group按时间分组,用aggregate管道聚合 会比group的处理效率要高而且更灵活方便
11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar...
MongoDB 聚合管道(Aggregation Pipeline) - 张善友 - 博客园
Mongodb聚合 mongodb的聚合函数使用方法
mongo聚合框架aggregate使用,管道 $match 过滤数据,只输出符合结果的文档,$limit $skip 限制管道输出的结果个数 和 跳过制定数量的结果,并且返回剩下的结果
meteor-aggregate, 对 Meteor的适当的MongoDB聚合支持 meteorhacks:aggregate为 Meteor 添加适当聚合支持的简单软件包。 这个包在 Mongo.Collection 实例上公开了 .aggregate 方法。这只在服务器端工作,没有...
关于mongodb的高级操作,包括聚合、主从复制、分片、备份与恢复、MR。 一、聚合 aggregate 聚合(aggregate)主要用于计算数据,类似sql中的sum()、avg() 语法: db.集合名称.aggregate([{管道:{表达式}}]) 管道:...
本书是一个小册子,简介明确的介绍了Mongodb聚合基本概念和操作,适合数据分析和财务管理人员入门使用,也适合于初学Mongodb的人员使用,字数不多,但是涵盖了Mongodb聚合框架的入门,常用的高级聚合,针对数据分析...
通过具体实例,我们将了解MongoDB聚合框架的使用方法,包括各种聚合管道阶段(如$match, $project, $group等)的运用。同时,深入探讨MongoDB索引的类型(如单键索引、复合索引、多键索引等),并分析索引的创建、...
主要介绍了MongoDB教程之聚合,MongoDB除了基本的查询功能之外,还提供了强大的聚合功能,这里主要介绍count、distinct和group,需要的朋友可以参考下
spring data mongodb 聚合 管道
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。 aggregate() 方法 MongoDB中聚合的方法使用aggregate()。 语法 aggregate() 方法的...
db.COLLECTION_NAME.aggregate() 方法用来构建和使用聚合管道,下图是官网给的实例,可以看出来聚合管道的用法还是比较简单的。 2. MongoDB Aggregation 管道操作符与表达式 常用的管道操作符有以下这些: ...
mongodb聚合学习使用文档
一、MongoDB 聚合管道(Aggregation Pipeline) 二、MongoDB Aggregation 管道操作符与表达式 三、 数据模拟
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。 aggregate() 方法 MongoDB中聚合的方法使用aggregate()。 语法 aggregate() 方法的...
前言 今天开发同学向我们提...二是,实现这个功能MongoDB聚合感觉有些复杂,聚合要走好多步。 数据记录格式如下: 记录1 { "_id" : ObjectId("5c1e23eaa66bf62c0c390afb"), "_class" : "C1", "resourceUrl" : "/st
标题:在 MongoDB 中使用 Map Reduce 检查波兰语和英语句子中的字母分布 动机 我们越来越多地听到各种网站遭到攻击以及密码非常薄弱的管理员的不负责任。 如何创建一个强密码:有一种观点认为你应该造一个句子,...
主要介绍了JAVA mongodb 聚合几种查询方式详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧