Heim Backend-Entwicklung PHP-Tutorial Mongodb Mapreduce-Nutzung und PHP-Beispielcode

Mongodb Mapreduce-Nutzung und PHP-Beispielcode

Aug 08, 2016 am 09:30 AM
count feed quot reduce

Obwohl MongoDB für die Gruppierung nicht so praktisch ist wie die Gruppierung nach Funktion unserer häufig verwendeten relationalen Datenbanken wie MySQL, SQLServer, Oracle, bietet MongoDB auch drei Möglichkeiten, eine Gruppierung zu erreichen: * Mongodb drei Gruppierungsmethoden : * 1. Gruppe (zuerst filtern und dann gruppieren, unterstützt kein Sharding, begrenzt die Datenmenge und ist nicht effizient) * 2. Mapreduce (basierend auf der JS-Engine, Single-Threaded-Ausführung, geringe Effizienz, geeignet für Hintergrundstatistiken usw.) * 3. Aggregat (empfohlen) (Wenn Ihre PHP-Mongodb-Treiberversion >=1.3.0 erfordert, wird die Verwendung von Aggregat empfohlen , das eine höhere Leistung bietet. Es gibt viele und sie sind einfacher zu verwenden, aber 1.3 unterstützt derzeit keinen Kontoauthentifizierungsmodus. Sie können das Update-Protokoll und Fehler über http://pecl.php.net/package/mongo überprüfen 🎜>Hier sind die folgenden Werfen Sie einen Blick auf die Mapreduce-Methode: Die offizielle Website von Mongodb stellt MapReduce vor: Map/reduce in MongoDB ist nützlich für die Stapelverarbeitung von Daten und Aggregationsvorgänge . Es ähnelt im Geiste der Verwendung von etwas wie Hadoop, wobei alle Eingaben aus einer Sammlung stammen und die Ausgaben häufig in eine Sammlung gehen Wenn Sie GROUP BY in SQL verwenden, ist Map/Reduce das richtige Tool in MongoDB. bedeutet ungefähr: Map/Reduce wird in Mongodb hauptsächlich für die Stapelverarbeitung und Aggregation von Daten verwendet, ähnlich wie bei der Verwendung von Hadoop Wenn Sie Sammlungsdaten verarbeiten, werden alle Eingabedaten aus der Sammlung abgerufen und die nach MapReduce ausgegebenen Daten werden ebenfalls in die Sammlung geschrieben. Normalerweise ähnlich wie wir die Group By-Anweisung in SQL verwenden. Die Verwendung von MapReduce erfordert die Implementierung von zwei Funktionen: Map und Reduce. Die Map-Funktion ruft emit(key, value) auf, um alle Datensätze in der Sammlung zu durchlaufen, und übergibt den Schlüssel und den Wert zur Verarbeitung an die Reduce-Funktion. Kartenfunktionen und Reduzierfunktionen sind in Javascript geschrieben und können MapReduce-Vorgänge über db.runCommand- oder Mapreduce-Befehle ausführen.
Der MapReduce-Befehl lautet wie folgt: 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] } );
Parameter Beschreibung:

mapreduce: der zu bedienende Zielsatz

map: Mapping-Funktion (erzeugt eine Folge von Schlüssel-Wert-Paaren als Parameter der Reduce-Funktion)

Reduzieren: Statistikfunktion

Abfrage: Zieldatensatzfilterung

Sortieren: Zieldatensätze sortieren

Limit: Anzahl der Zieldatensätze begrenzen

aus: Speicherung statistischer Ergebnisse (falls nicht angegeben) Verwenden Sie temporäre Sammlungen, die automatisch gelöscht werden, nachdem der Client die Verbindung getrennt hat)

keeptemp: ob die temporäre Sammlung beibehalten werden soll

finalize: Endverarbeitungsfunktion (führt aus). endgültige Sortierung nach den Ergebnissen der Reduzierungsrückgabe und Speicherung im Ergebnissatz)

Umfang: Externe Variablen zum Zuordnen, Reduzieren und Finalisieren importieren

Ausführlich: Detaillierte Zeitstatistiken anzeigen


Map-Funktion
Die Map-Funktion ruft das aktuelle Objekt auf, verarbeitet die Attribute des Objekts und übergibt den zu reduzierenden Wert. Die Map-Methode verwendet dies zum Betrieb das aktuelle Objekt und ruft die Methode „emit(key, value)“ mindestens einmal auf, um den zu reduzierenden Wert zu übergeben. Geben Sie Parameter an, wobei der Schlüssel von „emit“ die ID der endgültigen Daten ist.
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教程有兴趣的朋友有所帮助。

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Der Unterschied zwischen counta und count Der Unterschied zwischen counta und count Nov 20, 2023 am 10:01 AM

Mit der Count-Funktion wird die Anzahl der Zahlen in einem angegebenen Bereich gezählt. Sie ignoriert Text, logische Werte und Nullwerte, zählt jedoch leere Zellen. Die Count-Funktion zählt nur die Anzahl der Zellen, die tatsächliche Zahlen enthalten. Die Funktion CountA wird verwendet, um die Anzahl der nicht leeren Zellen in einem angegebenen Bereich zu zählen. Es zählt nicht nur Zellen, die tatsächliche Zahlen enthalten, sondern auch die Anzahl nicht leerer Zellen, die Text, logische Werte und Formeln enthalten.

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

Was bedeutet Futterfluss? Was bedeutet Futterfluss? Dec 07, 2020 am 11:01 AM

Ein Feed-Stream ist ein Informationsfluss, der den Benutzern kontinuierlich Inhalte aktualisiert und präsentiert. Ein Feed ist ein Inhaltsaggregator, der mehrere Nachrichtenquellen kombiniert, die Benutzer aktiv abonnieren, um Benutzern dabei zu helfen, kontinuierlich die neuesten Feed-Inhalte zu erhalten.

Zusammenfassung der Nutzungsunterschiede der MySQL Count-Funktion Zusammenfassung der Nutzungsunterschiede der MySQL Count-Funktion Nov 29, 2022 pm 04:47 PM

In diesem Artikel werden die Unterschiede in der Verwendung der MySQL-Funktion vorgestellt. Der Bedarf an statistischen Daten ist in unserer täglichen Entwicklung sehr einfach. Schauen wir uns als Nächstes die Unterschiede zwischen ihnen an. und ob sie einige Fallstricke haben.

PHP gibt die Summe aller Werte in einem Array zurück PHP gibt die Summe aller Werte in einem Array zurück Mar 21, 2024 pm 01:07 PM

In diesem Artikel wird die Summe aller Werte im von PHP zurückgegebenen Array ausführlich erläutert. Der Herausgeber hält dies für recht praktisch, daher teile ich es Ihnen als Referenz mit und hoffe, dass Sie nach dem Lesen dieses Artikels etwas gewinnen können. PHP gibt die Summe aller Werte in einem Array zurück. In PHP gibt es mehrere Möglichkeiten, die Summe aller Werte in einem Array zu berechnen. Hier sind einige der gebräuchlichsten Techniken: 1. Funktion array_sum() Mit der Funktion array_sum() kann die Summe aller Werte in einem Array berechnet werden. Es akzeptiert ein Array als Argument und gibt ein ganzzahliges Ergebnis zurück.

Was ist die Verwendung der Zählfunktion in PHP? Was ist die Verwendung der Zählfunktion in PHP? Sep 09, 2021 pm 05:08 PM

Die Verwendung der Zählfunktion in PHP lautet: [count(array,mode);], wobei der Parameter array das zu zählende Array angibt und der Parameter mode den Modus der Funktion angibt.

Wie zählt Java Count Elemente in einem Stream? Wie zählt Java Count Elemente in einem Stream? May 11, 2023 pm 04:07 PM

Hinweis 1. Count ist eine Terminaloperation, die die Gesamtzahl der Elemente im Stream zählen kann. Der Rückgabewert ist vom Typ long. 2. count() gibt die Anzahl der Elemente im Stream zurück. Dies ist ein Sonderfall der Induktion (eine Induktionsoperation nimmt eine Folge von Eingabeelementen und kombiniert sie durch wiederholte Anwendung der Kombinationsoperation zu einem zusammenfassenden Ergebnis). Dies ist ein Endvorgang und kann Konsequenzen und Nebenwirkungen haben. Nachdem ein Endvorgang durchgeführt wurde, gilt die Leitung als verbraucht und kann nicht wiederverwendet werden. Beispiel // Überprüfen Sie, ob eine Zeichenfolge in der Liste vorhanden ist, die mit a beginnt, und passen Sie sie an die erste an, d. h. geben Sie truebooleananyStartsWithA=stringCollection.stream().anyMatch((s) zurück

So lösen Sie das Problem der Anzahl verschiedener Spalten in MySQL So lösen Sie das Problem der Anzahl verschiedener Spalten in MySQL Jun 03, 2023 am 10:49 AM

Die reproduzierte Testdatenbank lautet wie folgt: CREATETABLE`test_distinct`(`id`int(11)NOTNULLAUTO_INCREMENT,`a`varchar(50)CHARACTERSETutf8DEFAULTNULL,`b`varchar(50)CHARACTERSETutf8DEFAULTNULL,PRIMARYKEY(`id`))ENGINE= InnoDBAUTO_INCREMENT =1DEFAULTCHARSET=latin1;Die Testdaten in der Tabelle lauten wie folgt. Jetzt müssen wir die deduplizierten Spalten dieser drei Spalten zählen.

See all articles