日期:2014-05-16  浏览次数:20585 次

来,我给你们看一段神奇的mongodb的mapreduce操作

? ? ? 来,我给你们看一段神奇的mongodbmapreduce操作!

?

?

首先我们执行一段js,用来往mongodb数据库里插入几条记录:

//insert.js
for(var i=0;i<5;i++){
db.RegistRecord.save({"ip":"11.11.11.11","account":"ongyong"});
}

for(var i=0;i<2;i++){
db.RegistRecord.save({"ip":"11.11.11.22","account":"ongyong22"});
}
for(var i=0;i<1;i++){
db.RegistRecord.save({"ip":"11.11.11.33","account":"ongyong33"});
}

?没有问题,随后我们来使用mongodbmapreduce来进行一个统计,统计同一ip在记录里出现的次数,很简单的mapreduce入门例子,写法如下,不多解释。

//regmp.js
printjson("job start");
var map = function() {
  emit(this.ip, {value: 1});
}

var reduce = function(key, values) {
  var count = 0;
  values.forEach(function(v) {
	count += v['value'];
  });
  return {count: count };

}

var res = db.runCommand({mapreduce:"RegistRecord",map:map, reduce:reduce, out:"log_results"});
printjson("job end")

?然后我们执行这个js脚本。

我们看结果:

/* 0 */
{
  "_id" : "11.11.11.11",
  "value" : {
    "count" : 5.0
  }
}

/* 1 */
{
  "_id" : "11.11.11.22",
  "value" : {
    "count" : 2.0
  }
}

/* 2 */
{
  "_id" : "11.11.11.33",
  "value" : {
    "value" : 1.0
  }
}

?OK,运算结果正确,各ip分别出现了5次,2次,1次。

OK,到这里,如果你认为我就是要为了演示这个东西,那我肯定是来找喷的,哥们儿,这特么一点也不神奇。神奇的事情在下面,我们继续看:

当我们把记录数增加到某一个量级,(如2000

//insert.js
for(var i=0;i<2000;i++){
db.RegistRecord.save({"ip":"11.11.11.11","account":"ongyong"});
}

for(var i=0;i<2;i++){
db.RegistRecord.save({"ip":"11.11.11.22","account":"ongyong22"});
}
for(var i=0;i<1;i++){
db.RegistRecord.save({"ip":"11.11.11.33","account":"ongyong33"});
}

?然后我们再次执行regmp.js这段代码运行mapreduce,注意,绝对没有任何改动,这时,神奇的事情出现了,看结果:

/* 0 */
{
  "_id" : "11.11.11.11",
  "value" : {