MongoDB聚合(count、distinct、group、MapReduce)
1. count:返回集合中文档的数量。
db.friend.count()
db.friend.count({'age':24})
增加查询条件会使count查询变慢。
2. distinct:找出给定键的所有不同的值。
使用时必须指定集合和键:
db.runCommand({'distinct':'friend','key':'age'})
3. group:分组统计。
示例:找出相同年龄(age)中,积分(score)最高的人。

参数说明:
ns:指定要进行分组的集合。
key:指定文档分组依据的键,键值相同的所有文档分为一组。
initial:每一组reduce函数调用时作为第二个参数传递给reduce函数的初始文档,每一组的所有成员都会
使用这个累加器,所以改变会被保留住。
$reduce:每个文档都对应一次这个调用,两个参数分别是当前文档和累加器文档(本组当前的结果)。
每一组都有一个独立的累加器存储本分组的结果。
condition:只处理满足条件的文档。
finalize:函数,完成器,在每组结果传递到客户端之前被调用一次,用以精简从数据库传到用户的数据。
例如,在上面的例子中可以在group中加入finalize参数来去除结果中的’age’键:
‘finalize’: function(prev) {
delete prev.age;
}
(参数prev是每个分组结果文档)
$keyf:将函数作为键使用,用作分组依据。当分组依据变得复杂,不再只是一个简单的键值那么简单的时候,
’key’参数已经无法满足需求,此时可以使用’$keyf’参数,它可以依据各种复杂的条件进行分组。
使用场景之一:依据分组键值进行分组,但忽略大小写。
‘$keyf’: function(x) {
return {‘name’:x.name.toLowerCase()};
}
(参数x表示当前文档对象,返回值一定要是一个对象,对象的键即是分组键。group中不能同时包含key参数和$keyf参数)
注意:分组依据键不存在的文档会被分到一组,并显示键值为null,可以在condition参数中加入{‘$exists’:true}来去掉这一组。
4. MapReduce:
使用MapReduce的代价就是速度慢,不能用在“实时”环境中。要作为后台任务来运行MapReduce,创建一个
保存结果的集合,然后对这个集合进行实时查询。
示例:找出集合中的所有键。

参数说明:
mapreduce:字符串,指定需要进行MapReduce操作的集合的名称。
map:函数,分组函数,将集合中的文档根据某个键的值进行分组(一个文档调用一次)。
reduce:函数,每个分组的处理函数(一个分组调用一次)。
在以上例子中,执行完map函数之后,传递给reduce函数的参数格式类似:key为’age’,
emits为[{‘count’:1},{‘count’:1},{‘count’:1}...]。
最终产生的结果集中”_id”键值为分组key的键值,”value”则是reduce函数返回的内容,目前reduce函数
不支持返回数组,会报错:multiple not supported yet。
finalize:函数,处理reduce调用之后产生的结果,MapReduce的最后一步(一般用于清除多余信息)。
keeptemp:布尔,连接关闭时临时结果集合是否保存。
out:字符串,结果集名称,设置该项则隐含着keeptemp:true。
不指定’out’参数会报错:’out’ has to be a string or an object。
query:文档,发往map函数前先使用指定条件过滤文档。
sort:文档,发往map函数前先给文档排序。
limit:整数,发往map函数的文档数量的上限。
scope:文档,JavaScript代码中要用到的变量。
scope是MapReduce的作用域键,可以使用“变量名:值”这样的普通文档来设置该选项,然后在map、reduce和
finalize函数中就能使用了。
verbose:布尔,是否产生更加详细的服务器日志。(查看MapReduce的运行过程,也可以用print把map、reduce、
finalize过程中的信息输出到服务器日志上。)
每个传递给map函数的文档都要事先反序列化,从BSON转换成JavaScript对象,这个过程非常耗资源。要是事先能
确定只对集合的一部分文档执行MapReduce,使用query、sort、limit来增加一层过滤层会极大地提高速度。
可以在MapReduce操作产生的结果集合上再进行MapReduce操作!
Group的结果集有4MB的大小限制,MapReduce则没有这个限制。
group和MapReduce对比示例:查询相同年龄人的名字。
(1)group:

(2)MapReduce:

MongoDB聚合(count、distinct、group、MapReduce)的更多相关文章
- MongoDB count distinct group by JavaAPI查询
import java.net.UnknownHostException; import com.mongodb.BasicDBList; import com.mongodb.BasicDBObje ...
- MongoDB聚合运算之group和aggregate聚集框架简单聚合(10)
聚合运算之group 语法: db.collection.group( { key:{key1:1,key2:1}, cond:{}, reduce: function(curr,result) { ...
- MongoDB 聚合函数
概念 聚合函数是对一组值执行计算并返回单一的值 主要的聚合函数 count distinct Group MapReduce 1.count db.users.count() db.users.cou ...
- ElasticSearch中"distinct","count"和"group by"的实现
最近在业务中需要使用ES来进行数据查询,在某些场景下需要对数据进行去重,以及去重后的统计.为了方便大家理解,特意从SQL角度,方便大家能够理解ES查询语句. 1 - distinct ; { &quo ...
- MongoDB 聚合 (转) 仅限于C++开发
MongoDB除了基本的查询功能,还提供了很多强大的聚合工具,其中简单的可计算集合中的文档个数, 复杂的可利用MapReduce做复杂数据分析. 1.count count返回集合中的文档数量 db. ...
- MongoDB学习笔记——聚合操作之group,distinct,count
单独的聚合命令(group,distinct,count) 单独聚合命令 比aggregate性能低,比Map-reduce灵活度低:但是可以节省几行javascript代码,后面那句话我自己加的,哈 ...
- mongodb MongoDB 聚合 group
MongoDB 聚合 MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 基本语法为:db.col ...
- mongodb MongoDB 聚合 group(转)
MongoDB 聚合 MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 基本语法为:db.col ...
- mongodb聚合 group
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 基本语法为:db.collection.agg ...
随机推荐
- Spring - bean的lazy-init属性(懒加载)
默认情况下,容器初始化的时候便会把bean实例化,通常这样做可以让一些配置或者bean实例化的异常在容器启动的时候就发现,而不是在N久之后.但有时候,我们希望某个可能不会用到但又不是100%不用的be ...
- 如何加固Linux系统
如何加固Linux系统 一. 账户安全 1.1 锁定系统中多余的自建帐号 检查方法: 执行命令 #cat /etc/passwd #cat /etc/shadow 查看账户.口令文件,与系统管理员确认 ...
- MySQL集群(四)之keepalived实现mysql双主高可用
前面大家介绍了主从.主主复制以及他们的中间件mysql-proxy的使用,这一篇给大家介绍的是keepalived的搭建与使用! 一.keepalived简介 1.1.keepalived介绍 Kee ...
- NET_NET深入体验与实战 第一章 .NET你知道 1.1什么是 .NET
1.1什么是 .NET 1.微软定义:Microsft.NET 是微软以 Web Service为核心的,支持 信息,人,系统的一组软件产品,技术或者服务. 2.战略和梦想:(1) Microsft ...
- CyclicBarrier的使用之王者荣耀打大龙
最近一直整并发这块东西,顺便写点Java并发的例子,给大家做个分享,也强化下自己记忆,如果有什么错误或者不当的地方,欢迎大家斧正. LOL和王者荣耀的玩家很多,许多人应该都有打大龙的经历,话说前期大家 ...
- 远程无法访问linux Mysql解决方案
在网上有很多关于这个的解决方案,我也采用了 写的比较详细的如: 1. 改表法.可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更 ...
- Ubuntu17.04安装wps
1.进入http://community.wps.cn/download/下载wps-office安装包,我下载的是dep的包. 2.进行安装执行命令:sudo dpkg -i wps-office_ ...
- JDFS:一款分布式文件管理系统,第三篇(流式云存储)
一 前言 看了一下,距离上一篇博客的发表已经过去了4个月,时间过得好快啊.本篇博客是JDFS系列的第三篇博客,JDFS的目的是为了实现一个分布式的文件管理系统,前两篇实现了基本的上传.下载功能,但是那 ...
- Spring之注解实现aop(面向切面编程)
1:Aop(aspect object programming)面向切面编程,名词解释: 1.1:功能:让关注点代码与业务逻辑代码分离 1.2:关注点 重复代码就叫做关注点 ...
- uva11806
[题意] n行m列网格放k个石子.有多少种方法?要求第一行,第一列,最后一行,最后一列必须有石子. [题解] 利用容斥原理.可以转到求"第一行.第一列.最后一行.最后一列没有石子" ...