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) ...
随机推荐
- Xcode代码格式化教程,可自定义样式
来源:iOS_小松哥 链接:http://www.jianshu.com/p/a725e24d7835 为什么要格式化代码 当团队内有多人开发的时候,每个人写的代码格式都有自己的喜好,也可能会忙着写代 ...
- C. Mobile phones
Suppose that the fourth generation mobile phone base stations in the Tampere area operate as follows ...
- windows获取时间的方法
介绍 我们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执 行一个特定的操作,比如在多媒体中,比如在游戏中等,都会用到时间函数.还比如我们通过记录 ...
- 【MYSQL】数据类型
转载 https://www.baidu.com/s?ie=UTF-8&wd=cnblog 原文 泪云山海的博客 mysql 数据类型 1.整型 MySQL数据类型 含义(有符号) tinyi ...
- NSOperation与GCD之间的关系
NSOperation与GCD的相同之处 1.NSOperation和NSOperationQueue实现多线程的步骤: 先将需要执行的操作封装到一个NSOperation对象中. 然后将NSOper ...
- (转)Git Gui for Windows的建库、克隆(clone)、上传(push)、下载(pull)、合并
原文地址: http://blog.csdn.net/fym0512/article/details/7713006 本教程将讲述:gitk的Git Gui的部分常用功能和使用方法,包括:建库.克隆( ...
- MVC4 Forms 验证,部署到Hyper-v上.FormsAuthentication.SetAuthCookie无效的问题
这是IE10的一个bug或者说是asp.net4的一个Bug,在IE10里更改了http头,这样导致asp.net4认为客户端没有启用cookie,会导致验证失败.简单的解决方法是,在网站根目录,新增 ...
- oracle PL/SQL(procedure language/SQL)程序设计
PL/SQL(procedure language/SQL)语言是Oracle对SQL语言的过程化扩充,是一个完整的编程语言.PL/SQL实现了过程化语句(如分支.循环等)与SQL语句的无缝连接,将过 ...
- python 基础——装饰器
python 的装饰器,其实用到了以下几个语言特点: 1. 一切皆对象 2. 函数可以嵌套定义 3. 闭包,可以延长变量作用域 4. *args 和 **kwargs 可变参数 第1点,一切皆对象,包 ...
- C++之vector用法
1.插入配对 std::vector<pair<int,int> > w; w.push_back(make_pair<int,int>(f,s) ); cout ...