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) ...
随机推荐
- HTML与Servlet
1.什么是servlet Servlet 是在服务器上运行的小程序.一个 Servlet 就是 Java 编程语言中的一个类,它被用来扩展服务器的性能,服务器上驻留着可以通过“请求-响应”编程模型来访 ...
- solrj-WiKi
solrj是一个访问solr的客户端,它提供了一个接口,用于添加.更新.删除索引数据. solrj跨版本兼容 solrj一般保持向后兼容,所以你可以使用新版本的solrj访问老版本的solr服务,也可 ...
- leetcode题解:Tree Level Order Traversal II (二叉树的层序遍历 2)
题目: Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from ...
- OC之Block的用法和实现委托
Block的基本概念 Block的基本用法 Block实现委托机制 一.Block的基本概念 Block是程序的代码块,这个代码块可以在需要的时候执行.IOS开发中,block到处可见,所以学好很重要 ...
- OC之category的用法
简介 实例 好处 一.category简介 动态的为某个已经存在的类增加方法,不可以增加成员变量 二.实例 // // Student+CatetoryStudent.h // Category // ...
- 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 ...
- linux_jvm_jhat_dump内存分析
jhat命令 jhat命令 -- Java Head Analyse Tool 用途:是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询 ...
- Linux中的特殊权限粘滞位(sticky bit)详解
Linux下的文件权限 在linux下每一个文件和目录都有自己的访问权限,访问权限确定了用户能否访问文件或者目录和怎样进行访问.最为我们熟知的一个文件或目录可能拥有三种权限,分别是读.写.和执行操作, ...
- SpringData JPA详解
Spring Data JPA 1. 概述 Spring JPA通过为用户统一创建和销毁EntityManager,进行事务管理,简化JPA的配置等使用户的开发更加简便. Spring Data ...
- eclipse bookmark的使用
为什么要使用bookmark 写代码一般不是从上往下写,经常在几个模块之间变换的写,你可能使用搜索功能ctrl+f,ctrl+c,这样查找位置将会变的非常痛苦. 因为重要的位置一般就那么几个,如定义部 ...