继续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的常用操作(三)的更多相关文章

  1. mongodb的常用操作

    对于nosql之前工作中有用到bekerlydb,最近开始了解mongodb,先简单写下mongodb的一些常用操作,当是个总结: 1.mongodb使用数据库(database)和集合(collec ...

  2. 【mongodb系统学习之八】mongodb shell常用操作

    八.mongodb  shell常用基础操作(每个语句后可以加分号,也可以不加,看情况定(有的工具中可以不加),最好是加): 1).进入shell操作界面:mongo,上边已有演示: 2).查看当前使 ...

  3. MongoDB的常用操作总结

    简介 MongoDB是一款强大.灵活.且易于扩展的通用型数据库 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. ...

  4. MongoDB之常用操作

    最近经常使用MongoDB来进行数据的操作,特此记录总结一下

  5. mac 安装mongodb与常用操作

    1.安装 brew update brew install mongodb 2.启动mongo mongod --config /usr/local/etc/mongod.conf 3.启动 mong ...

  6. Python脚本控制的WebDriver 常用操作 <三> 浏览器最大化

    下面将模拟执行一个控制浏览器最大化的操作 测试用例场景 当我们在测试中使用一些基于图像和坐标的辅助测试工具时,我们就会需要使浏览器在每次测试时保存最大化,以便在同一分辨率下进行图像比对和坐标点选. 举 ...

  7. mongodb的常用操作(二)

    继续mongodb的学习: 9.mongodb条件查询 假设有user集合,里面结构如下:{ "_id" : ObjectId("52ab35d281181f853264 ...

  8. MongoDB数据库常用操作

    推荐文章 --- 一天精通MongoDB数据库 注意: monogdb数据在使用之后必须及时 mongodb.close()否则后台崩溃. 1. 删除文档中的一个字段 db.<集合名>.u ...

  9. javascript的常用操作(三)

    $.ajax 中的contentType 在 cnodejs.org 论坛中有一个问题,让我也很奇怪,说是 $.ajax 设置数据类型 applicaiton/json之后,服务器端(express) ...

随机推荐

  1. HTML与Servlet

    1.什么是servlet Servlet 是在服务器上运行的小程序.一个 Servlet 就是 Java 编程语言中的一个类,它被用来扩展服务器的性能,服务器上驻留着可以通过“请求-响应”编程模型来访 ...

  2. solrj-WiKi

    solrj是一个访问solr的客户端,它提供了一个接口,用于添加.更新.删除索引数据. solrj跨版本兼容 solrj一般保持向后兼容,所以你可以使用新版本的solrj访问老版本的solr服务,也可 ...

  3. leetcode题解:Tree Level Order Traversal II (二叉树的层序遍历 2)

    题目: Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from ...

  4. OC之Block的用法和实现委托

    Block的基本概念 Block的基本用法 Block实现委托机制 一.Block的基本概念 Block是程序的代码块,这个代码块可以在需要的时候执行.IOS开发中,block到处可见,所以学好很重要 ...

  5. OC之category的用法

    简介 实例 好处 一.category简介 动态的为某个已经存在的类增加方法,不可以增加成员变量 二.实例 // // Student+CatetoryStudent.h // Category // ...

  6. Read / Write Excel file in Java using Apache POI

    Read / Write Excel file in Java using Apache POI 2014-04-18 BY DINESH LEAVE A COMMENT About a year o ...

  7. linux_jvm_jhat_dump内存分析

    jhat命令   jhat命令 -- Java Head Analyse Tool 用途:是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询 ...

  8. Linux中的特殊权限粘滞位(sticky bit)详解

    Linux下的文件权限 在linux下每一个文件和目录都有自己的访问权限,访问权限确定了用户能否访问文件或者目录和怎样进行访问.最为我们熟知的一个文件或目录可能拥有三种权限,分别是读.写.和执行操作, ...

  9. SpringData JPA详解

    Spring Data JPA 1.    概述 Spring JPA通过为用户统一创建和销毁EntityManager,进行事务管理,简化JPA的配置等使用户的开发更加简便. Spring Data ...

  10. eclipse bookmark的使用

    为什么要使用bookmark 写代码一般不是从上往下写,经常在几个模块之间变换的写,你可能使用搜索功能ctrl+f,ctrl+c,这样查找位置将会变的非常痛苦. 因为重要的位置一般就那么几个,如定义部 ...