mongodb的常用操作(三)
继续mongodb的学习和总结:
11.mongodb的mapreduce功能
mapreduce可以说是mongodb的一个很强大的功能,可以实现复杂的运算和统计,做一个简要的总结:
假设有user集合,内容如下:
> db.user.find()
{ "_id" : ObjectId("52ab35d281181f85326409da"), "uname" : "jiangwang", "pwd" : 123456, "age" : 111 }
{ "_id" : ObjectId("52ab35d281181f85326409db"), "uname" : "jiangwang", "pwd" : 123456, "age" : 111 }
{ "_id" : ObjectId("52ab35d281181f85326409dc"), "uname" : "jiangwang", "pwd" : 123456, "age" : 111 }
{ "_id" : ObjectId("52ab35d281181f85326409dd"), "uname" : "jiangwang", "pwd" : 123456, "age" : 111 }
{ "_id" : ObjectId("52ab35d281181f85326409de"), "uname" : "jiangwang", "pwd" : 123456, "age" : 111 }
{ "_id" : ObjectId("52ab35d281181f85326409df"), "uname" : "jiangwang", "pwd" : 123456, "age" : 111 }
{ "_id" : ObjectId("52ab35d281181f85326409e0"), "uname" : "jiangwang", "pwd" : 123456, "age" : 111 }
{ "_id" : ObjectId("52ab35d281181f85326409e1"), "uname" : "jiangwang", "pwd" : 123456, "age" : 111 }
{ "_id" : ObjectId("52ab35d281181f85326409e2"), "uname" : "jiangwang", "pwd" : 123456, "age" : 111 }
{ "_id" : ObjectId("52ab35d281181f85326409e3"), "uname" : "jiangwang", "pwd" : 123456, "age" : 111 }
{ "_id" : ObjectId("52ac600d430cfd3d522c6b30"), "uname" : "jiang", "pwd" : "hello", "age" : 24 }
mapreduce的功能就是,通过map分组得到列表,然后通过reduce对map的列表进行计算,得到最终的结果
mapreduce分两部分,map和reduce。
map函数的定义为Map(k1,v1) → list(k2,v2)
reduce函数的定义Reduce(k2, list(v2)) → list(v3)
map运算后得到一个列表,reduce将列表转换为另外一种形式的列表
MapReduce 的操作:
db.runCommand(
{
mapreduce : <collection>,
map : <mapfunction>,
reduce : <reducefunction>
[, query : <query filter object>]
[, sort : <sorts the input objects using this key. Useful for optimization, like sorting by the emit key for fewer reduces>]
[, limit : <number of objects to return from collection>]
[, out : <see output options below>]
[, keeptemp: <true|false>]
[, finalize : <finalizefunction>]
[, scope : <object where fields go into javascript global scope >]
[, verbose : true]
}
);
参数说明:
mapreduce: 要操作的目标集合名字。
map: 映射函数 (生成键值对序列,作为 reduce 函数参数)。
reduce: 统计函数。
query: 目标记录过滤。
sort: 目标记录排序。
limit: 限制目标记录数量。
out: 统计结果存放集合 (不指定则使用临时集合,在客户端断开后自动删除)。
keeptemp: 是否保留临时集合。
finalize: 最终处理函数 (对 reduce 返回结果进行最终整理后存入结果集合)。
scope: 向 map、reduce、finalize 导入外部变量。
verbose: 显示详细的时间统计信息。
[]中为可选参数
例如,需要计算出user表中的相同姓名的年龄的总和,并且根据姓名和年领分组:
db.runCommand({
mapreduce:"user",
map:function(){
emit({key0:this.uname,key1:this.age},this.age);
},
reduce:function(key,values){
var total = 0;
for(var i = 0; i < values.length; i++){
total += values[i];
}
return total;
},
out:"user_groupbyname"
});
将分组结果输出到user_groupbyname集合中,db.user_groupbyname.find()结果如下:
{ "_id" : { "key0" : "hello" , "key1" : 24 }, "value" : 24 }
{ "_id" : { "key0" : "jiang" , "key1" : 24 }, "value" : 24 }
{ "_id" : { "key0" : "jiangwang", "key1" : 111 }, "value" : 1110 }
当然为了简洁,js可以用变量存储函数:
var m = function(){
emit({key0:this.uname,key1:this.age},this.age);
};
var r = function(key,values){
var total = 0;
for(var i = 0; i < values.length; i++){
total += values[i];
}
return total;
};
db.runCommand({
mapreduce:"user",
map:m,
reduce:r,
out:"user_groupbyname"
});
在第10部分学习过mongodb的存储过程,其实就是函数,那么这里就可以将函数写到system.js集合中,通过db.eval()调用
db.system.js.save({_id:'m',value:function(){
emit({key0:this.uname,key1:this.age},this.age);
}});
db.system.js.save({_id:'r',value:function(key,values){
var total = 0;
for(var i = 0; i < values.length; i++){
total += values[i];
}
return total;
}});
调用方式如下:
db.runCommand({
mapreduce:"user",
map:db.eval("m"),
reduce:db.eval("r"),
out:"user_groupbyname"
});
以上三种方式写mapreduce结果都一样.
另外,在使用map和reduce根据具体的需求,可以灵活改变这两个函数,实现不同的功能。
例如需要统计名字相同的人的年龄的平均值,那么reduce函数改成求平均值:
var r = function(key,values){
var total = 0;
for(var i = 0; i < values.length; i++){
total += values[i];
}
if(values.length != 0){
return total/values.length;
}
else{
return 0;
}
};
mongodb的常用操作(三)的更多相关文章
- mongodb的常用操作
对于nosql之前工作中有用到bekerlydb,最近开始了解mongodb,先简单写下mongodb的一些常用操作,当是个总结: 1.mongodb使用数据库(database)和集合(collec ...
- 【mongodb系统学习之八】mongodb shell常用操作
八.mongodb shell常用基础操作(每个语句后可以加分号,也可以不加,看情况定(有的工具中可以不加),最好是加): 1).进入shell操作界面:mongo,上边已有演示: 2).查看当前使 ...
- MongoDB的常用操作总结
简介 MongoDB是一款强大.灵活.且易于扩展的通用型数据库 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. ...
- MongoDB之常用操作
最近经常使用MongoDB来进行数据的操作,特此记录总结一下
- mac 安装mongodb与常用操作
1.安装 brew update brew install mongodb 2.启动mongo mongod --config /usr/local/etc/mongod.conf 3.启动 mong ...
- Python脚本控制的WebDriver 常用操作 <三> 浏览器最大化
下面将模拟执行一个控制浏览器最大化的操作 测试用例场景 当我们在测试中使用一些基于图像和坐标的辅助测试工具时,我们就会需要使浏览器在每次测试时保存最大化,以便在同一分辨率下进行图像比对和坐标点选. 举 ...
- mongodb的常用操作(二)
继续mongodb的学习: 9.mongodb条件查询 假设有user集合,里面结构如下:{ "_id" : ObjectId("52ab35d281181f853264 ...
- MongoDB数据库常用操作
推荐文章 --- 一天精通MongoDB数据库 注意: monogdb数据在使用之后必须及时 mongodb.close()否则后台崩溃. 1. 删除文档中的一个字段 db.<集合名>.u ...
- javascript的常用操作(三)
$.ajax 中的contentType 在 cnodejs.org 论坛中有一个问题,让我也很奇怪,说是 $.ajax 设置数据类型 applicaiton/json之后,服务器端(express) ...
随机推荐
- UIImage图片处理,旋转、截取、平铺、缩放等操作
来源:iOS_小松哥 链接:http://www.jianshu.com/p/9ab1205f5166 有时候我们需要处理图片,比如改变大小,旋转,截取等等,所以今天说一说图片处理相关的一些操作. 本 ...
- 数据库实例创建好后,用plsql登录居然提示ora-12526监听程序:所有适用例程都处于受限模式的问题
解决办法:以sys身份登录执行该语句:ALTER SYSTEM DISABLE RESTRICTED SESSION;
- TCP/IP协议原理与应用笔记20:直接交付 和 间接交付
1. 直接交付 和 间接交付 直接交付:分组的目的与分组的发送接口在同一个IP网络中 间接交付:分组的目的与分组的发送接口在不同的IP网络中 如图: 2. 交付过程: (1)交付方式判别 分组的目的I ...
- 【Android Studio使用教程3】Android Studio的一些设置 体验更好了
Android Studio 简单设置 界面设置 默认的 Android Studio 为灰色界面,可以选择使用炫酷的黑色界面. Settings --> Appearance --> T ...
- Android小项目之九 两种上下文的区别
------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 按惯例,写在前面的:可能在学习Android的过程中,大家会和我一样,学习过大量的基础知识,很多的知识点 ...
- 重构23-Introduce Parameter Object(参数对象)
有 时当 使用 一个 包含 多 个 参 数 的 方 法 时 , 由 于参 数 过 多 会 导 致 可 读 性 严 重 下 降 , 如 : 有 时当 使用 一个 包含 多 个 参 数 的 方 法 时 , ...
- 51nod 平均数(二分+树状数组)
题目链接: 平均数 基准时间限制:4 秒 空间限制:131072 KB 分值: 80 LYK有一个长度为n的序列a. 他最近在研究平均数. 他甚至想知道所有区间的平均数,但是区间数目实在太多了. 为了 ...
- .net C# 网页播放器 支持多种格式 媒体播放器 播放器 代码
.avi格式代码片断如下:<object id='video' width='400' height='200' border='0' classid='clsid:CFCDAA03-8BE4- ...
- 学习Slim Framework for PHP v3 (三)
继续上一篇的问题,如何动态的添加不同的Module.添加Module是给Middleware用的,用于调用Module的写日志方法.上篇中的写法是在app->add(mv),这时的middlew ...
- EventDemoandStyleDemoandThemeDemo
Event Handling 示例: 分为EventListener. EventListenerRegistration和EventHandler. 注册Event的三种方法: 1) 在Activ ...