MongoDB学习(使用分组、聚合和映射-归并)
使用分组、聚合和映射-归并
MongoDB的强大功能之一,是直接在服务器对文档的值进行复杂的操作,而不用先发文档发送到客户端在进行处理。
结果分组
对大型数据集进行查询操作时,通常会根据文档的字段值对其进行分组。这可以在取回文档后通过代码来完成,但在服务器端查找的同时进行分组效率跟高。
要将查询结果分组,可使用Collection对象的方法 group()。该语法为:
db.collection_name.group({key, reduce, initial, [keyf], [cond], finalize})
参数列表:
- key:指定要根据哪些健进行分组。其属性为要用于分组的字段,值为 1。
- reduce:一个接受参数 obj 和 prev 的函数( function(obj,prev))。对于每个与查询匹配的文档,都执行这个参数。其中参数 obj 为当前文档,而 prev 是根据参数 initial 创建的对象。(可以通过obj来更新prev,如计数或累计)。
- initial:可以创建一个group分组字段,并包含初始值,用于在分组期间聚合数据。(常见的是使用一个计数器来跟踪匹配的文档数。{ initial : {"count" : 0 } } )。
- keyf:可选。指定一个函数,这个函数返回一个用于分组的key对象,用于替代参key。这样可以使用函数动态地指定根据哪些字段分组。
- cond:可选。查找条件,表示从哪些结果集中进行分组。
- finalize:可选。在reduce执行之后,结果集返回之前,对结果集进行的最终操作。可以精简数据。
示例:
数据集:

执行分组命令:
db.student.group({
key:{age:1},
initial:{"count":0},
reduce:function(obj,prev) {
prev.count++;
}
})

MongoDB聚合
理解 aggregate() 方法
Collection对象提供了对数据执行聚合操作的方法 aggregate()。该方法主要用于数据处理(诸如统计平均值,求和等),并返回计算的结果。
db.collection_name.aggregate( operator, [ operator ,...] )
参数 operator 是一系列聚合运算符,让您指定要在流水线的各个阶段对数据执行哪种聚合操作。执行的一个运算符后,将结果传给下一个运算符继续运算。
该方法直接返回一个包含聚合结果的迭代器。

使用聚合框架运算符
MongoDB提供的聚合框架非常强大,通过 aggrgate() 方法可以反复将一个聚合运算符的结果传递给下一个运算符。

注意在引用文档中的字段名时,需要在字段名前加 $ ,表示这是一个字段值而不是字符串。
| 运算符 | 描述 | 示例 |
| $project | 通过重命名、添加或删除字段来重新定义文档。还能重新计算值以及添加子文档 | { $project : { title : " $name " } } |
| $match | 可以实现查找的功能 | { $match : { value : { $gt : 50 } } } |
| $limit | 限制文档数,返回结果集中的前 n 个数 | { $limit : 5 } |
| $skip | 丢弃结果集中的前 n 个文档,效率较低,依然会遍历前 n 个文档 | { $skip : 5 } |
| $unwind | 其值必须是数组字段的名称。对指定的数组进行分拆,为其中的每个值创建一个文档 | { $unwind : { $myArr } } |
| $group | 将文档分组并生成新的文档,可以进行一系列子命令 | { $group : { _id : " $name " , num : { $sum : 1 } } } |
| $sort | 将文档排序 | { $sort : { name : 1 , age : -1 } } |
MapReduce() 方法
Map-Reduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。
MongoDB提供的Map-Reduce非常灵活,对于大规模数据分析也相当实用。
db.collection_name.mapReduce( map , reduce , arguments );
其中 map 是一个函数,用于分组,它将对数据集的每个对象执行它来生成一个键和值,这些值被加入到与键相关联的数组中,供归并阶段使用。
// map 函数
function() {
emit ( key , value );
}
参数 reudce 也是一个函数,将对 map 函数生成的每个对象执行它。reduce 函数必须将键作为第一个参数,将与键相关联的值数组作为第二个参数,并使用值数组来计算得到与键相关联的单个值,再返回结果。
// reduce 函数 处理需要统计的字段
function ( key , value ) {
......统计字段处理
return result;
}
参数 arguments 是一个对象,指定了检索传递给 map 函数的文档时使用的选项。
{
out : collection, // 统计结果存放集合 (不指定则使用临时集合,在客户端断开后自动删除)。
query : document, // 一个筛选条件,只有满足条件的文档才会调用map函数。(query。limit,sort可以随意组合)
sort : document, // 和limit结合的sort排序参数(也是在发往map函数前给文档排序),可以优化分组机制
limit : number // 发往map函数的文档数量的上限(要是没有limit,单独使用sort的用处不大)
}
MongoDB学习(使用分组、聚合和映射-归并)的更多相关文章
- MongoDB学习笔记-05 聚合
MongoDB除了基本查询功能之外,还有强大的聚合工具,其中包括:count().distinct().group().mapreduce. 计数函数count count是最简单的聚合工具,用于返回 ...
- mongodb学习之:聚合
@font-face { font-family: "Times New Roman"; }@font-face { font-family: "宋体"; }p ...
- MongoDB学习3:聚合查询
1. 什么是MongoDB聚合框架 1.1 MongoDB聚合框架(Aggregation Frameworn)是一个计算框架,它可以: ● 作用在一个或几个集合上 ● 对集合中的数据 ...
- MongoDB学习--高级查询 [聚合Group]
Group大约需要一下几个参数. key:用来分组文档的字段.和keyf两者必须有一个 keyf:可以接受一个javascript函数.用来动态的确定分组文档的字段.和key两者必须有一个 initi ...
- MongoDB学习总结(三) —— 常用聚合函数
上一篇介绍了MongoDB增删改查命令的基本用法,这一篇来学习一下MongoDB的一些基本聚合函数. 下面我们直奔主题,用简单的实例依次介绍一下. > count() 函数 集合的count函数 ...
- mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)
最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网: ...
- Dubbo -- 系统学习 笔记 -- 示例 -- 分组聚合
Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 分组聚合 按组合并返回结果,比如菜单服务,接口一样,但有多种实现,用group区分 ...
- 【转】mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)
mongoDB 学习笔记纯干货(mongoose.增删改查.聚合.索引.连接.备份与恢复.监控等等) http://www.cnblogs.com/bxm0927/p/7159556.html
- MongoDB学习总结(二)
前言:学习札记! MongoDB学习总结(二) 1. 安装.初识 之前写过一篇MongoDB的快速上手文章,里边详细的讲了如何安装.启动MongoDB,这里就不再累述安装过程,简单介绍一下Mongo ...
随机推荐
- 有趣的8个IT冷知识
阅读本文大概需要 2.8 分钟. 想要成为一名成功的程序员,我们除了了解不同编程语言的设计思路,也应当了解编程的发展历史,从而判断未来的编程技术将走向何方.接下就为大家普及下计算机发展历程中的8个冷门 ...
- 多租户实现之基于Mybatis,Mycat的共享数据库,共享数据架构
前言 SaaS模式是什么? 传统的软件模式是在开发出软件产品后,需要去客户现场进行实施,通常部署在局域网,这样开发.部署及维护的成本都是比较高的. 现在随着云服务技术的蓬勃发展,就出现了SaaS模式. ...
- C#开发APP,ToolBar控件在Smobiler中的使用方式【附案例源码】——Smobiler移动开发平台
控件说明 底部工具栏控件. 效果演示 其他效果 该界面为仿淘宝UI制作的一个简单的UI模板,源码获取方式请拉至文章末尾. 特色属性 属性 属性说明 Direction(相对布局) 容器主轴方向. Fl ...
- 在做关于NIO TCP编程小案例时遇到无法监听write的问题,没想到只是我的if语句的位置放错了位置,哎,看了半天没看出来
在做关于NIO TCP编程小案例时遇到无法监听write的问题,没想到只是我的if语句的位置放错了位置,哎,看了半天没看出来 贴下课堂笔记: 在Java中使用NIO进行网络TCP套接字编程主要以下几个 ...
- 联发科Helio P90(mt6779),P70(mt6775),P60(MT6771),P35,P22(MT6762)芯片参数规格
Helio P90(mt6779)是一款人工智能处理平台,集成了超级强大的AI专核APU 2.0,具有超强的AI性能和一系列基于人工智能的成像升级.该芯片将重新定义消费者对智能手机AI功能的体验.He ...
- Android组件化开发的简单应用
组件化开发的主要步骤: 一.新建Modules 1.新建Project,作为应用的主Module. 2.新建Module:"Common",类型选择"Android Li ...
- Ubuntu移除mysql后重新安装
首先删除mysql: sudo apt-get remove mysql-* 然后清理残留的数据 dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg ...
- cmd 配置dchp服务器
1.安装DHCP服务器角色,这样在netsh下才会有dhcp上下文 2.编写配置dhcp的脚本 从命令行运行netsh有两种语法: 比如要获取已经配置的网络接口列表 1.写全 netsh -r Rem ...
- xshell6 评估期已过 解决办法
xshell6 评估期已过,因为我下载的版本是evaluation版本,是有期限的.大家可以修改为Home and school use 的版本,这样就不会出现这个提示了.具体的操作步骤如下: 1.前 ...
- .NET Core TDD 前传: 编写易于测试的代码 -- 单一职责
第1篇: 讲述了如何创造"缝". "缝"(seam)是需要知道的概念. 第2篇, 避免在构建对象时写出不易测试的代码. 第3篇, 依赖项和迪米特法则. 第4篇 ...