MongoDB除了基本查询功能之外,还有强大的聚合工具,其中包括:count()、distinct()、group()、mapreduce.

计数函数count

count是最简单的聚合工具,用于返回文档的数量:

>db.user.count() // 返回集合user的个数

传递查询文档时,则计算查询结果的数量:

>db.user.count({"age":{"$lt":20}}) // 返回年龄小于20岁的用户数

该函数对于分页时的总数非常有必要

去重函数distinct

distinct函数用来找出给定键的所有不同的值。使用时必须指定集合和键:

>db.runCommand({"distinct":"user","key":"age"}) // 获取age键的不同的值

有时候需要获取集合中所有不同的键,此时需要自己编写MapReduce,内置没有这样的函数。

values返回键所对应的所有不同的值,数组形式。

stats返回distinct过程的一些指标。

n:返回的集合数量,

nscanned:扫描过的文档数量,

timems:耗费的时间(毫秒),

cursor:使用的索引(BasicCursor:无索引,BtreeCursor)

分组函数group

MongoDB会根据分组依据的键将集合分成若干个组,再聚合每个组内的文档。

>db.runCommand({"group":{

"ns":"user",

"key":"day",

"initial":{"time":0},

"$reduce":function(doc,prev){

if(doc.time>prev.time){

prev.price = doc.price;

prev.time = doc.time;

}

},

"condition":{"day":{"$gt":"2014/12/21"}}

}})

"ns":"user":指定分组的集合为user

"key":"day":指定文档分组依据的键

"initial":{"time":0}每一组reduce函数调用的时间,会作为初始文档传递给后续过程。

"$reduce":每个文档都对应一次这个调用。系统会传递两个参数:当前文档和累加器文档。

"condition":指定条件

使用完成器:finalizer

完成器finalizer用于精简数据库传给用户的数据,group命令的输出一定要能放到单个数据库响应中。

>db.runCommand({"group":{

"ns":"post",

"key":"{"tags":true}", // 等同于"key":"tags"

"initial":{"tags":{}},

"$reduce":function(doc,prev){

for(i in doc.tags){

if(doc.tags[i] in prev.tags){

prev.tags[doc.tags[i]]++;

}else{

Prev.tags[doc.tags[i]]=1;

},

"finalize":function(prev){

var mostPopular = 0;

for(i in prev.tags){

if(prev.tags[i]>mostPopular){

prev.tag=i;

mostPopular=prev.tags[i];

}

}

Detete prev.tags

}

}}})

将$reduce处理后的结果再进行处理,然后返回给客户端。

将函数作为键使用

定义分组函数时使用"$keyf"代替"key":

"$keyf":function(x){return x.category.toLowerCase();}

MapReduce

count、distict、group能做的事,MapReduce都能做。MapReduce的基本使用如下:

>mr=db.runCommand({"mapreduce":"user","map":map,"reduce":reduce})

"mapreduce":对哪个集合作处理

"map":map函数,可以在上述命令前先定义

"reduce":reduce函数,可以在上述命令前先定义

map函数使用函数emit返回要处理的值,this表示对当前文档的引用:

>map=function(){

for(var key in this){

emit(key,{ "count":1});

}};

reduce能处理emit返回的文档和其他reduce结构的各种组合:

>reduce=function(key,emits){

total = 0;

for(var I in emits){

total+=emits[i].count;

}

return {"count":total};

}

MapReduce函数的返回文档类似如下:

result:存放mapreduce结果的集合名,为临时集合,mapreduce连接关闭后自动删除。

timeMillis:操作花费的时间,单位毫秒

input:发生到map函数的文档个数

emit:在map函数中emit被调用的次数

output:结果集合中创建的文档数量。

MapReduce的其他可选键

MapReduce命令除了必须的键:mapreduce、map、reduce之外,还有如下的可选键:

finalize:对reduce的输出结果作进一步处理

keeptemp:连接关闭时,临时集合是否保存。

output:结果集合的名字,设定该项则隐含着keeptemp:true。

query:会在发往map函数前,先用指定条件过滤文档。

sort:在发往map前先给文档排序。

limit:发往map函数的文档数量的上限。

scope:javaScript代码中要用到的变量(变量名:值)。

verbose:是否产生更加详细的服务器日志。

MongoDB学习笔记-05 聚合的更多相关文章

  1. MongoDB学习笔记05

    count 返回集合中文档数量文档数量 db.foo.count() db.foo.count({}) distinct用来找出给定键的所有不同的值,使用时必须指定集合和键 db.runCommand ...

  2. mongodb 学习笔记05 --用户管理

    csdn的markdown编辑器真有够烂的,这篇文章又给弄丢了 启用认证 mongod 启动默认没有开启权限,你须要指定 –auth 启动.或者在配置文件里设置security.authorizati ...

  3. mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)

    最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网: ...

  4. 【转】mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)

    mongoDB 学习笔记纯干货(mongoose.增删改查.聚合.索引.连接.备份与恢复.监控等等) http://www.cnblogs.com/bxm0927/p/7159556.html

  5. MongoDB 学习笔记(原创)

    MongoDB 学习笔记 mongodb 数据库 nosql 一.数据库的基本概念及操作 SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table ...

  6. MongoDB学习笔记:MongoDB 数据库的命名、设计规范

    MongoDB学习笔记:MongoDB 数据库的命名.设计规范     第一部分,我们先说命名规范. 文档 设计约束 UTF-8 字符 不能包含 \0 字符(空字符),这个字符标识建的结尾 . 和 $ ...

  7. MongoDB学习笔记:快速入门

    MongoDB学习笔记:快速入门   一.MongoDB 简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.M ...

  8. MongoDB学习笔记系列

    回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...

  9. PHP操作MongoDB学习笔记

    <?php/*** PHP操作MongoDB学习笔记*///*************************//**   连接MongoDB数据库  **////*************** ...

随机推荐

  1. CRC16 三种算法及c实现

    标准CRC生成多项式如下表: 名称                     生成多项式                           简记式*                 标准引用   CR ...

  2. HUST 1017 - Exact cover (Dancing Links 模板题)

    1017 - Exact cover 时间限制:15秒 内存限制:128兆 自定评测 5584 次提交 2975 次通过 题目描述 There is an N*M matrix with only 0 ...

  3. 背包九讲 && 题目

    ★.背包求方案数的时候,多重背包是不行的,因为产生重复的背包会有多种情况. ★.背包记录路径的时候,其实是不行的,因为更新了12的最优解,如果它依赖于6这个背包,然后你后面改变了6这个背包,就GG 1 ...

  4. webView 点击页面跳转到浏览器

    @interface ForumDetailViewController ()<UIWebViewDelegate> { NSUInteger _clickedNumber; } @end ...

  5. Nginx Location配置总结

    Nginx Location配置总结 语法规则: location [=|~|~*|^~] /uri/ { - }= 开头表示精确匹配^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即 ...

  6. JSP中的 HttpSession、pageContext对象

    pageContext 隐含对象对应javax.servlet.jsp.PageContext,都自动的被加入至pageContext中, 您可以由它来取得与JSP相关的对应之Servlet对象,像是 ...

  7. iOS代码实现九宫格

    #define ScreenW [UIScreen mainScreen].bounds.size.width #define ScreenH [UIScreen mainScreen].bounds ...

  8. Git基础知识与常用命令

    一:相关概念: 1:工作区(Working Directory): 就是你在电脑里能看到的目录 2:版本库(Repository): 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库. ...

  9. WCF use ProtoBuf

    ProtoBuf, 比起xml和json, 传输的数据里面没有自描述标签, 而且是基于二进制的, 所以有着超高的传输效率, 据牛人张善友的描述, 可以替代WCF的自带的编码方案, 效率有极大的提升. ...

  10. 遇到IIS7配置PHP出现403和404错误的解决办法

    服务器要配置PHP,总是出现403错误.服务器是新装的,操作系统是windows server 2008 R2,装的IIS7. IIS里PHP和本地服务器对比了好几遍,都没到出错的原因,后来通过cmd ...