Mongodb聚合函数
插入 测试数据

for(var j=1;j<3;j++){
for(var i=1;i<3;i++){
var person={
Name:"jack"+i,
Age:i,
Address:["henan","wuhan"],
Course:[
{Name:"shuxue",Score:i},
{Name:"wuli",Score:i}
]
}
db.DemoTest.Person.insert(person)
}
}

Count
db.DemoTest.Person.count({Name:"jack1"})
返回数量
distinct
db.DemoTest.Person.distinct("Name")
返回不重复的Name值。
group
例子:按照Name分组,条件是Age大于46

db.DemoTest.Person.group({
"key":{"Name":true}, -----分组的keky
"initial":{"Person":[]},-------每组分享的一个”初始化函数“
"$reduce":function(cur,prev){ ------这个函数的第一个参数是当前的文档对象,第二个参数是上一次function操作的累计对象,第一次为initial中的{”person“:[]}。有多少个文档, $reduce就会调用多少次
prev.Person.push(cur);
},
"finalize":function(prev){ ---返回每组的数量
prev.count=prev.Person.length;
},
"condition":{"Age":{"$lt":46}} -----过滤条件
})

返回结果如下:
mapReduce
mapReduce其实是一种编程模型,用在分布式计算中,其中有一个“map”函数,一个”reduce“函数。
map:
这个称为映射函数,里面会调用emit(key,value),集合会按照你指定的key进行映射分组。
reduce:
这个称为简化函数,会对map分组后的数据进行分组简化,注意:在reduce(key,value)中的key就是
emit中的key,vlaue为emit分组后的emit(value)的集合,这里也就是很多{"count":1}的数组。
mapReduce:
这个就是最后执行的函数了,参数为map,reduce和一些可选参数。
在MongoDB存储的文档上执行聚合操作非常有用,这种方式的一个限制是聚合函数(比如,SUM、AVG、MIN、MAX)需要通过mapper和reducer函数来定制化实现。
MongoDB没有原生态的用户自定义函数(UDFs)支持。但是它允许使用db.system.js.save命令来创建并保存JavaScript函数,JavaScript函数可以在MapReduce中复用。
第一种统计方式--对应集合直接统计
1.在MongoDB javascript Shell中对Array对象进行了一些扩展,其中新增sum方法,以方便统计数据之用的。

Array.sum=function(arr){
if(arr.length == 0)
return null;
var s = arr[0];
for(var i = 1; i < arr.length; i++)
s += arr[i];
return s;
}

2.例子:按照名称分组,统计每组年龄的和,条件是年龄小于2.
如果统计数量:var map = function(){ emit(this.Name, 1); } 其实是让值永远为1
var map = function(){ emit(this.Name, this.Age); }
var reduce = function( key, values ){ return Array.sum(values); }
var options = {query: { Age: {$lt: 2} }, out: { inline : 1 }}
db.Person.mapReduce(map,reduce,options)
结果如下
分析一下:
1. map部分
作用:用于分组的。
emit(param1, param2)
param1:需要分组的字段,this.字段名。
param2:需要进行统计的字段,this.字段名。
2. reduce部分
作用:处理需要统计的字段
var reduce = function(key, values){
......统计字段处理
}
key: 指分组字段(emit的param1)对应的值
values:指需要统计的字段(emit的param2)值组成的数组
简单介绍统计常用的方法:
* 对数值类型进行求和
|
1
2
3
4
|
<span style="font-size: 16px;">var reduce = function(key, values){return Array.sum(values);}</span> |
* 对字符串类型进行拼凑
|
1
2
3
|
<span style="font-size: 16px;">var reduce = function(key, values){return values.join(', ');}</span> |
3. options部分
{ query: { age: {$lt: 25} }, out: "name_totals" }
query:先筛选符合条件的记录出来,再进行分组统计。
out:将分组统计后的结果输出到哪个集合当中。
默认情况下,out所指定的集合在数据库断开连接后再次打开时,依旧存在,并保留之前的所有记录的。
4. 执行分组统计
>db.集合名.mapReduce( map, reduce, options )
第二种统计方式--命令统计
1.命令如下:
注意:out参数 out:"Person_Name" 代表会创建一个临时表Person_Name 然后再从临时表中查找,out:{inline:1} 代表直接显示在当前命令执行的结果中

var map = function(){ emit(this.Name, this.Age); }
var reduce = function( key, values ){ return Array.sum(values); }
db.runCommand({
mapreduce:"Person",
map:map,
reduce:reduce,
out:"Person_Name",
keeptemp: false,
query: { Age:{ $lt: 2 }},
sort:{ Name:1},
limit:3
})

解析:
mapreduce:
分组统计的集合名
eg:
mapreduce: 'mythings'
不能写成mapreduce: mythings,否则报异常:mythings is not defined
map,reduce :
同上,不做阐述
out :
将分组统计结果输出到某个集合。
注意:不能缺省,必须指定名称,否则报错,报错如下:
“exception: 'out' has to be a string or an object”
keeptemp :
是否保留临时集合(指out指定的集合)
keeptemp:false时会在数据库断开连接后,MongoDB会移除该集合的所有记录。而不是删除。
keeptemp:true时即使数据库断开连接后,再次连接上,该临时集合依旧保持之前所有记录。
keeptemp默认值为true。
query :
筛选记录后,再进行分组统计
eg:
query: { age:{ $lt: 25 }}
sort :
对分组统计的集合进行排序,也即先排序,后再执行分组统计的。
注意:这里的排序需要用到索引,必须先创建索引。
limit :
对分组统计的集合先进行限制返回记录的条数,然后再去进行统计操作。注意:不要理解成对统计后的结果进行限制返回记录条数。
verbose :
显示时间统计信息,取值为true/false
Mongodb聚合函数的更多相关文章
- Mongodb学习笔记四(Mongodb聚合函数)
第四章 Mongodb聚合函数 插入 测试数据 ;j<;j++){ for(var i=1;i<3;i++){ var person={ Name:"jack"+i, ...
- MongoDB 聚合函数
概念 聚合函数是对一组值执行计算并返回单一的值 主要的聚合函数 count distinct Group MapReduce 1.count db.users.count() db.users.cou ...
- MongoDB 聚合函数及排序
聚合函数 最大值 $max db.mycol.aggregate([{$group : {_id : "$by_user", num_max : {$max: "$li ...
- 在MongoDB中实现聚合函数 (转)
随着组织产生的数据爆炸性增长,从GB到TB,从TB到PB,传统的数据库已经无法通过垂直扩展来管理如此之大数据.传统方法存储和处理数据的成本将会随着数据量增长而显著增加.这使得很多组织都在寻找一种经济的 ...
- MongoDB学习总结(三) —— 常用聚合函数
上一篇介绍了MongoDB增删改查命令的基本用法,这一篇来学习一下MongoDB的一些基本聚合函数. 下面我们直奔主题,用简单的实例依次介绍一下. > count() 函数 集合的count函数 ...
- 在MongoDB中实现聚合函数
在MongoDB中实现聚合函数 随着组织产生的数据爆炸性增长,从GB到TB,从TB到PB,传统的数据库已经无法通过垂直扩展来管理如此之大数据.传统方法存储和处理数据的成本将会随着数据量增长而显著增加. ...
- MongoDB 聚合管道(Aggregation Pipeline)
管道概念 POSIX多线程的使用方式中, 有一种很重要的方式-----流水线(亦称为"管道")方式,"数据元素"流串行地被一组线程按顺序执行.它的使用架构可参考 ...
- SQL与Mongodb聚合的对应关系(举例说明)
SQL中的聚合函数和Mongodb中的管道相互对应的关系: WHERE $match GROUP BY $group HAVING $match SELECT $project ORDER BY $s ...
- MongoDB聚合
--------------------MongoDB聚合-------------------- 1.aggregate(): 1.概念: 1.简介 ...
随机推荐
- python后台架构Django教程——manage.py命令
一.manage.py命令选项 manage.py是每个Django项目中自动生成的一个用于管理项目的脚本文件,需要通过python命令执行.manage.py接受的是Django提供的内置命令. 内 ...
- Spring boot 学习六 spring 继承 mybatis (基于注解)
MyBatis提供了多个注解如:@InsertProvider,@UpdateProvider,@DeleteProvider和@SelectProvider,这些都是建立动态语言和让MyBatis执 ...
- ReportEvent的正确使用方式
向操作系统的事件管理器报告重大信息是一种非常有用的方式,特别是对于没有界面的后台服务而言.如果你对Windows编程有一定了解,应该很快就能想到使用ReportEvent这个API,然后快速写出下面的 ...
- <正则吃饺子> :关于redis集群的测试demo
redis集群的测试demo,来自网络,具体不详. 1.下载地址,如下:http://download.csdn.net/detail/u012543819/9729291 2.项目是java项目,结 ...
- Elasticsearch的前后台运行与停止(tar包方式)
备注:在生产环境中,往往一般用后台来运行.jps查看. 1.ES的前台运行 [hadoop@djt002 elasticsearch-2.4.3]$ pwd/usr/local/elasticsear ...
- apache配置中的小细节
configuration error: couldn’t perform authentication错误的解决办法 configuration error: couldn’t perform au ...
- Django 中ORM 的使用
一:Django 中 orm 的使用 1:手动新建一个数据库 2 :告诉Django连接哪个数据库 settings.py里配置数据库连接信息: #数据库相关的配置项 DATABASES ={ 'de ...
- js基础(补10.10)
1.内嵌式: <html> <head> <title></title> </head> <body> <a href=& ...
- CodeForces - 828C String Reconstruction 并查集(next跳)
String Reconstruction Ivan had string s consisting of small English letters. However, his friend Jul ...
- 《剑指offer》面试题8—旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组末尾我们称之为数组的旋转.要求:输入一个递增排序的数组的旋转,输出旋转数组中的最小数字.例如{3,4,5,1,2}是{1,2,3,4,5}的一个旋转,该数组的 ...