博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mongodb聚合函数
阅读量:6227 次
发布时间:2019-06-21

本文共 3608 字,大约阅读时间需要 12 分钟。

 

插入 测试数据

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}}   -----过滤条件    })

返回结果如下:

 
返回的json

 

 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)

结果如下

 
结果json

 

分析一下:

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

转载于:https://www.cnblogs.com/wangjing666/p/6837131.html

你可能感兴趣的文章
leetcode — symmetric-tree
查看>>
Parencodings
查看>>
web服务端重定向
查看>>
浅谈薄见
查看>>
Session模型简介
查看>>
C实现shell管理的一个例子
查看>>
为ASP.NET控件加入快捷菜单
查看>>
Tftod 的服务器使用下载文件
查看>>
装机、UEFI双系统安装
查看>>
jsp入门
查看>>
Android-----使用Button特效 selector+shape
查看>>
android获取/更改gps和WIFI状态
查看>>
自定义线程池
查看>>
SQL Server性能优化(11)非聚集索引的覆盖索引存储结构
查看>>
Django后台管理定制admin
查看>>
从源码分析scrollTo、scrollBy、Scroller方法的区别和作用
查看>>
购买内存条的几点方法
查看>>
[51Nod1487]占领资源
查看>>
Asymptote 学习记录(1):基本的安装以及用批处理模式和交互模式绘图
查看>>
高效率随机删除数据(不重复)
查看>>