MongoDB学习笔记-05 聚合
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 聚合的更多相关文章
- MongoDB学习笔记05
count 返回集合中文档数量文档数量 db.foo.count() db.foo.count({}) distinct用来找出给定键的所有不同的值,使用时必须指定集合和键 db.runCommand ...
- mongodb 学习笔记05 --用户管理
csdn的markdown编辑器真有够烂的,这篇文章又给弄丢了 启用认证 mongod 启动默认没有开启权限,你须要指定 –auth 启动.或者在配置文件里设置security.authorizati ...
- mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)
最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网: ...
- 【转】mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)
mongoDB 学习笔记纯干货(mongoose.增删改查.聚合.索引.连接.备份与恢复.监控等等) http://www.cnblogs.com/bxm0927/p/7159556.html
- MongoDB 学习笔记(原创)
MongoDB 学习笔记 mongodb 数据库 nosql 一.数据库的基本概念及操作 SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table ...
- MongoDB学习笔记:MongoDB 数据库的命名、设计规范
MongoDB学习笔记:MongoDB 数据库的命名.设计规范 第一部分,我们先说命名规范. 文档 设计约束 UTF-8 字符 不能包含 \0 字符(空字符),这个字符标识建的结尾 . 和 $ ...
- MongoDB学习笔记:快速入门
MongoDB学习笔记:快速入门 一.MongoDB 简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.M ...
- MongoDB学习笔记系列
回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...
- PHP操作MongoDB学习笔记
<?php/*** PHP操作MongoDB学习笔记*///*************************//** 连接MongoDB数据库 **////*************** ...
随机推荐
- Magento1.9批量修改产品 Attribute Set
今天修改产品时遇到这样一个需求:重新设置产品的 Attribute Set,使用的是Magento1.9系统,Magento提供这样一个插件 Flagbit Change Attribute Set: ...
- PowerDesigner 16.5 反向PostgreSQL9.01 中 Unable to list the columns. SQLSTATE = 22003不良的类型值 short : t 解决方法
Database➙Edit Current DBMS… General tab➙PostgreSQL 9.x➙Script➙Objects➙Column➙SqlListQuery or Tools➙R ...
- button点击ajax异步无效的处理办法,以及实现“关注”“已关注”切换
button并不是在只等于submit时草有提交功能,如果你用它触发ajax事件,你的ajax会失去他最大的优势:刷新局部数据! 但是你如果设置了他的return false;属性小伙伴你的ajax才 ...
- Appium移动自动化测试之获取appPackage和appActivity
方法一:直接打开Appium,点击左上角机器人图标 选择apk所在位置,如图所示,这里以ContactManager.apk为例 方法二:利用dex2jar和jd-gui这两个工具反编译apk文件 这 ...
- 记录容易忘记的知识点(html 内容)
<xx 表文件名> 导入外部样式表 <link type="text/css" rel="stylesheet" href="xx. ...
- C#ActiveX控件开发学习
一:C#ActiveX控件开发注意事项 1:C#开发的ActiveX控件只可在装有Framework的系统上才能用. 2:只有IE浏览器支持. 3:初次安装需要导入代码签名证书及其证书链的方式, ...
- final阶段140字评论1
1.约跑app 此次演讲增加了摄像头演示的功能,所以界面可以看得更清楚,演示的比上次完整,流畅,约跑这个项目感觉对于我们颇有使用价值,大家现在都热爱跑 ...
- Window Server 2012 R2 没有照片查看器 打开图片都是画板问题怎么解决
新安装了 Window Server 2012 R2 系统,感觉屌屌的样子,加上开机速度蛮快,心里略爽.结果,打开图片一看,发现竟然是画板,而且还没有照片查看器,顿时泪流满面. 后来我利用了强大的百度 ...
- ABAP POPUP函数
POPUP_TO_CONFIRM_LOSS_OF_DATA 弹出一个对话框告知用户有可能丢失数据,询问是否操作继续.POPUP_TO_CONFIRM_STEP 弹出一个对话框询问用户是否操作继续. P ...
- JavaScript数组删除重复元素(去重)的方法
1. var arr=str.split(""); ;arr.length->i;i++){ ;j<arr.length;j++){ if(arr[j]==arr[i] ...