Mongodb mapreduce 사용법 및 PHP 샘플 코드

WBOY
풀어 주다: 2016-08-08 09:30:30
원래의
1246명이 탐색했습니다.
MongoDB는 mysql, sqlserver, oracle과 같이 일반적으로 사용되는 관계형 데이터베이스의 기능별로 그룹화하는 것만큼 편리하지는 않지만 MongoDB에도 그룹화를 달성하는 세 가지 방법이 있습니다. * Mongodb 세 가지 그룹화 방법 : * 1. 그룹(필터링 후 그룹, 샤딩 지원 안함, 데이터 양 제한, 효율적이지 않음) * 2. mapreduce(js 엔진 기반, 단일 스레드 실행, 낮은 효율성, 백그라운드 통계에 적합 등) * 3. 집계(권장) (PHP mongodb 드라이버 버전에 >=1.3.0이 필요한 경우 집계 사용을 권장함) 더 높은 성능을 가지고 있는 것이 많고, 사용하기 더 간편하지만, 1.3은 현재 계정 인증 모드를 지원하지 않습니다. http://pecl.php.net/package/mongo를 통해 업데이트 로그 및 버그를 확인할 수 있습니다. 🎜>다음은 다음과 같습니다. mapreduce 방법을 살펴보세요. Mongodb 공식 웹사이트에서 MapReduce를 소개합니다. MongoDB의 Map/reduce는 데이터 일괄 처리 및 집계 작업에 유용합니다. . 이는 모든 입력이 컬렉션에서 나오고 출력이 컬렉션으로 이동하는 Hadoop과 같은 것을 사용하는 것과 유사합니다. SQL에서 GROUP BY를 사용하면 map/reduce는 MongoDB에서 적합한 도구입니다. 대략적인 의미는 다음과 같습니다. Mongodb의 Map/reduce는 주로 일괄 처리 및 데이터 집계에 사용됩니다. Hadoop을 사용하는 경우와 다소 비슷합니다. 컬렉션 데이터를 처리하면 모든 입력 데이터가 컬렉션에서 얻어지고 MapReduce 이후의 데이터 출력도 컬렉션에 기록됩니다. 일반적으로 SQL에서 Group By 문을 사용하는 방법과 유사합니다. MapReduce를 사용하려면 Map과 Reduce라는 두 가지 기능을 구현해야 합니다. Map 함수는 Emit(key, value)을 호출하여 컬렉션의 모든 레코드를 순회하고 처리를 위해 키와 값을 Reduce 함수에 전달합니다. Map 함수와 Reduce 함수는 Javascript로 작성되었으며 db.runCommand 또는 mapreduce 명령을 통해 MapReduce 작업을 수행할 수 있습니다.
MapReduce 명령은 다음과 같습니다. db.runCommand( { mapreduce : <collection>, map : <mapfunction>, reduce : <reducefunction> [, query : <queryfilterobject>] [, sort : <sortthequery.usefulforoptimization>] [, limit : <numberofobjectstoreturnfromcollection>] [, out : <output-collectionname>] [, keeptemp: <true|false>] [, finalize : <finalizefunction>] [, scope : <objectwherefieldsgointojavascriptglobalscope >] [, verbose : true] } );
매개변수 설명:

mapreduce: 연산할 대상 설정

map: 매핑 함수(Reduce 함수의 매개변수로 키-값 쌍의 시퀀스를 생성)

reduce: 통계 함수

query: 대상 레코드 필터링

sort: 대상 레코드 정렬

limit: 대상 레코드 수 제한

out: 통계 결과 저장 컬렉션 (지정하지 않은 경우) 임시 컬렉션 사용, 클라이언트 연결 끊김 후 자동 삭제)

keeptemp : 임시 컬렉션 유지 여부

finalize : 최종 처리 기능 수행 감소 반환 결과에 대한 최종 정렬 및 결과 집합에 저장)

범위: 매핑, 축소, 마무리를 위해 외부 변수 가져오기

상세: 자세한 시간 통계 표시


map 함수
map 함수는 현재 객체를 호출하고, 객체의 속성을 처리한 후, Reduce에 값을 전달하는 방식으로 map 메소드가 동작합니다. 현재 객체를 반환하고, 적어도 한 번은 Emit(key, value) 메소드를 호출하여 감소할 값을 전달합니다. 여기서 Emit의 키는 최종 데이터의 ID입니다.
reduce函数 
接收一个值和数组,根据需要对数组进行合并分组等处理,reduce的key就是emit(key,value)的key,value_array是同个key对应的多个value数组。 
Finalize函数 
此函数为可选函数,可在执行完map和reduce后执行,对最后的数据进行统一处理。 
看完基本介绍,我们再来看一个实例:已知集合feed,测试数据如下:{ "_id": ObjectId("50ccb3f91e937e2927000004"), "feed_type": 1, "to_user": 234, "time_line": "2012-12-16 01:26:00" }{ "_id": ObjectId("50ccb3ef1e937e0727000004"), "feed_type": 8, "to_user": 123, "time_line": "2012-12-16 01:26:00" }{ "_id": ObjectId("50ccb3e31e937e0a27000003"), "feed_type": 1, "to_user": 123, "time_line": "2012-12-16 01:26:00" }{ "_id": ObjectId("50ccb3d31e937e0927000001"), "feed_type": 1, "to_user": 123, "time_line": "2012-12-16 01:26:00" }
我们按动态类型feed_type和用户to_user进行分组统计,实现结果:
feed_type to_user cout
1 234 1
8 123 1
1 123 2







实现代码://编写map函数$map = ' function() { var key = {to_user:this.to_user,feed_type:this.feed_type}; var value = {count:1}; emit(key,value); } '; //reduce 函数$reduce = ' function(key, values) { var ret = {count:0}; for(var i in values) { ret.count += 1; } return ret; }'; //查询条件$query = null; //本实例中没有查询条件,设置为null$mongo = new Mongo('mongodb://root:root@127.0.0.1: 28017/'); //链接mongodb,账号和密码为root,root$instance = $mongo->selectDB("testdb"); //执行此命令后,会创建feed_temp_res的临时集合,并将统计后的数据放在该集合中$cmd = $instance->command(array( 'mapreduce' => 'feed', 'map' => $map, 'reduce' => $reduce, 'query' => $query, 'out' => 'feed_temp_res' )); //查询临时集合中的统计数据,验证统计结果是否和预期结果一致$cursor = $instance->selectCollection('feed_temp_res')->find(); $result = array(); try { while ($cursor->hasNext()) { $result[] = $cursor->getNext(); } } catch (MongoConnectionException $e) { echo$e->getMessage(); } catch (MongoCursorTimeoutException $e) { echo$e->getMessage(); } catch(Exception$e){ echo$e->getMessage(); } //test var_dump($result);
下面是输出的结果,和预期结果一致{ "_id": { "to_user": 234, "feed_type": 1 }, "value": { "count": 1 }}{ "_id": { "to_user": 123, "feed_type": 8 }, "value": { "count": 1 }}{ "_id": { "to_user": 123, "feed_type": 1 }, "value": { "count": 2 }}
以上只是简单的统计实现,你可以实现复杂的条件统计编写复杂的reduce函数,可以增加查询条件,排序等等。附上mapReduce数据库处理函数(简单封装)/** * mapReduce分组 * * @param string $table_name 表名(要操作的目标集合名) * @param string $map 映射函数(生成键值对序列,作为 reduce 函数参数) * @param string $reduce 统计处理函数 * @param array $query 过滤条件 如:array('uid'=>123) * @param array $sort 排序 * @param number $limit 限制的目标记录数 * @param string $out 统计结果存放集合 (不指定则使用tmp_mr_res_$table_name, 1.8以上版本需指定) * @param bool $keeptemp 是否保留临时集合 * @param string $finalize 最终处理函数 (对reduce返回结果进行最终整理后存入结果集合) * @param string $scopemap、reduce、finalize 导入外部js变量 * @param bool $jsMode 是否减少执行过程中BSON和JS的转换,默认true(注:false时 BSON-->JS-->map-->BSON-->JS-->reduce-->BSON,可处理非常大的mapreduce,//true时BSON-->js-->map-->reduce-->BSON) * @param bool $verbose 是否产生更加详细的服务器日志 * @param bool $returnresult 是否返回新的结果集 * @param array &$cmdresult 返回mp命令执行结果 array("errmsg"=>"","code"=>13606,"ok"=>0) ok=1表示执行命令成功 * @return*/ function mapReduce($table_name,$map,$reduce,$query=null,$sort=null,$limit=0,$out='',$keeptemp=true,$finalize=null,$scope=null,$jsMode=true,$verbose=true,$returnresult=true,&$cmdresult){ if(empty($table_name) || empty($map) || empty($reduce)){ return null; } $map = new MongoCode($map); $reduce = new MongoCode($reduce); if(empty($out)){ $out = 'tmp_mr_res_'.$table_name; } $cmd = array( 'mapreduce' => $table_name, 'map' => $map, 'reduce' => $reduce, 'out' =>$out ); if(!empty($query) && is_array($query)){ array_push($cmd, array('query'=>$query)); } if(!empty($sort) && is_array($sort)){ array_push($cmd, array('sort'=>$query)); } if(!empty($limit) && is_int($limit) && $limit>0){ array_push($cmd, array('limit'=>$limit)); } if(!empty($keeptemp) && is_bool($keeptemp)){ array_push($cmd, array('keeptemp'=>$keeptemp)); } if(!empty($finalize)){ $finalize = new Mongocode($finalize); array_push($cmd, array('finalize'=>$finalize)); } if(!empty($scope)){ array_push($cmd, array('scope'=>$scope)); } if(!empty($jsMode) && is_bool($jsMode)){ array_push($cmd, array('jsMode'=>$jsMode)); } if(!empty($verbose) && is_bool($verbose)){ array_push($cmd, array('verbose'=>$verbose)); } $dbname = $this->curr_db_name; $cmdresult = $this->mongo->$dbname->command($cmd); if($returnresult){ if($cmdresult && $cmdresult['ok']==1){ $result = $this->find($out, array()); } } if($keeptemp==false){ //删除集合 $this->mongo->$dbname->dropCollection($out); } return$result; }
MongoDB官方网站介绍:MapReduce介绍  http://docs.mongodb.org/manual/core/map-reduce/Aggregation介绍  http://docs.mongodb.org/manual/aggregation/ 

以上就介绍了mongodb的mapreduce用法及php示例代码,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿