MongoDB MapReduce学习笔记

MapReduce应该算是MongoDB操作中比较复杂的了,自己开始理解的时候还是动了动脑子的,所以记录在此!

命令语法:详细看


db.runCommand(

{ mapreduce : 字符串,集合名,

map : 函数,见下文

reduce : 函数,见下文

[, query : 文档,发往map函数前先给过渡文档]

[, sort : 文档,发往map函数前先给文档排序]

[, limit : 整数,发往map函数的文档数量上限]

[, out : 字符串,统计结果保存的集合]

[, keeptemp: 布尔值,链接关闭时临时结果集合是否保存]

[, finalize : 函数,将reduce的结果送给这个函数,做最后的处理]

[, scope : 文档,js代码中要用到的变量]

[, jsMode : 布尔值,是否减少执行过程中BSON和JS的转换,默认true] //注:false时 BSON-->JS-->map-->BSON-->JS-->reduce-->BSON,可处理非常大的mapreduce,<br>                                    //true时BSON-->js-->map-->reduce-->BSON

[, verbose : 布尔值,是否产生更加详细的服务器日志,默认true]

}

);

测试数据:

现在我要统计同一age的name,也就是像如下的结果:

{age:0,names:["name_6","name_12","name_18"]}
{age:1,names:["name_1","name_7","name_13","name_19"]}
......

第一步是写映射(Map)函数,可以简单的理解成分组吧~

var m=function(){
    emit(this.age,this.name);
}

emit的第一个参数是key,就是分组的依据,这是自然是age了,后一个是value,可以是要统计的数据,下面会说明,value可以是JSON对象。

这样m就会把送过来的数据根据key分组了,可以想象成如下结构:

第一组
{key:0,values: ["name_6","name_12","name_18"]

第二组
{key:1,values: ["name_1","name_7","name_13","name_19"]
......

组中的key其实就是age的值了,values是个数组,数组内的成员都有相同的age!!。

第二步就是简化了,编写reduce函数:

var r=function(key,values){
    var ret={age:key,names:values};
    return ret;
}

reduce函数会处理每一个分组,参数也正好是我们想像分组里的key和values。

这里reduce函数只是简单的把key和values包装了一下,因为不用怎么处理就是我们想要的结果了,然后返回一个对象。对象结构正好和我们想象的相符!:

{age:对应的age,names:[名字1,名字2..]}

最后,还可以编写finalize函数对reduce的返回值做最后处理:

var f=function(key,rval){
    if(key==0){
        rval.msg="a new life,baby!";
    }
    return rval
}

这里的key还是上面的key,也就是还是age,rval是reduce的返回值,所以rval的一个实例如:{age:0,names:["name_6","name_12","name_18"]},

这里判断 key 是不是 0 ,如果是而在 rval 对象上加 msg 属性,显然也可以判断 rval.age==0,因为 key 和 rval.age 是相等的嘛!!

这里其他的选项就不说了,一看就知道。

运行:

db.runCommand({
    mapreduce:"t",
    map:m,
    reduce:r,
    finalize:f,
    out:"t_age_names"
    }
)

结果导入到 t_age_names 集合中,查询出来正是我想要的结果,看一下文档的结构,不难发现,_id 就是 key,value 就是处理后的返回值。

时间: 2024-11-05 07:29:10

MongoDB MapReduce学习笔记的相关文章

MongoDB + node-mongoskin学习笔记

特点 无模式 MongoDB 中的每一条文档,都是一个 JSON 对象,因此你无需预定义一个集合的结构,集合中的每个文档也可以有不同的结构. 异步写入 MongoDB 默认所有的写操作都是『不安全』的,即当请求被 MongoDB 收到时,不等写入操作完成,就返回一个『成功』的响应. 这是默认的行为,当然你设置一些选项,让操作等待等待写入完成后再返回响应.不过对于大多数应用,这种『不安全』已经足够安全了. 简单查询 MongoDB 只支持简单的查询,MongoDB 只储存数据,更多的逻辑应该在应用

MongoDB快速学习笔记

一,下载. XP系统,32位的下载地址: https://www.mongodb.org/dl/win32/i386 例:win32/mongodb-win32-i386-2.0.7.ziphttp://downloads.mongodb.org/win32/mongodb-win32-i386-2.0.7.zip大小约17M. win32/mongodb-win32-i386-3.2.7.ziphttp://downloads.mongodb.org/win32/mongodb-win32-i

【mongoDB】学习笔记_01

MongoDB 简介 简介 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.它支持的数据结构非常松散,是类似 json 的 bson 格式,因此可以存储比较复杂的数据类型. 面向集合的存储 在 MongoDB 中,一个数据库包含多个集合,类似于 MySQL 中一个数据库包含多个表:一个集合包含多个文档,类似于 MySQL 中一个表包含多条数据 MongoDB 基本概念 数据库 一个 MongoDB 可以创建多个数据库 使用 show

mongodb的学习笔记一(集合和文档的增删改查)

1数据库的增删改查 一.增加一个数据库: use blog-----切换到指定的数据库,如果数据库不存在,则自动创建该数据库(新建的数据库,如果没有存储对应的集合,是不会显示出来的) 二.删除一个数据库 1首先用use 切换到你需要删除的数据库 use test 2然后执行db.dropDatabase()命令 db.dropDatabase() 三.修改一个数据库的名字 db.copyDatabase(fromdb, todb, fromhost) fromdb:源数据库, todb:目标数据

【mongoDB】学习笔记_02

查询语句 环境准备: > use mydbswitched to db mydb> db.createCollection('user'){ "ok" : 1 }> > > db.user.insert({name:'niuh',age:11})> db.user.insert({name:'kk',age:22})> > > db.post.find find() 语句 //find() 用法:db.COLLECTION_NAME

MapReduce学习笔记

mapreduce是一种编程模式,用于大规模数据的并行运算.“Map”,“Reduce”是它们的主要思想.用户用Map(映射)函数把一组键值对映射成另一组键值对,指定并发的Reduce(归纳)函数,来保证所有映射的键值对中的每一个共享共同的键组. 工作原理: 如上图: 右图是论文里给出的流程图.一切都是从最上方的user program开始的,user program链接了MapReduce库,实现了最基本的Map函数和Reduce函数.图中执行的顺序都用数字标记了. 1.MapReduce库先

MongoDB数据库学习笔记

一.Mongodb数据库之增删改查 show databasesshow dbs    //显示数据库: show tables    show collections    //查示表或者集合: use imooc  //使用或创建数据库imooc: 增:use imoocdb.imooc_collection.insert({x:1})    //往集合名"imooc_collection"插入单条数据"x:1": db.imooc_collection.ins

MongoDB Java 学习笔记 (Java操作MongoDB)

原文地址:http://blog.csdn.net/ererfei/article/details/50857103 参考文档:http://www.runoob.com/mongodb/mongodb-java.html

MongoDB 基本操作学习笔记

// 查看所有数据库 show dbs // amdin 0.000GB // local 0.000GB // 使用数据库 use admin // switched to db admin // 创建数据库:向数据库中插入记录 db.user.insert({ 'name': 'wangxi' }) // WriteResult({ "nInserted" : 1 }) // 显示当前数据库 db // admin // 查询当前集合中的文档 db.user.find() // {