Maison base de données tutoriel mysql MongoDB学习之旅十二:MongoDBMapReduce

MongoDB学习之旅十二:MongoDBMapReduce

Jun 07, 2016 pm 03:55 PM
mongodb 学习

MongDB的MapReduce相当于MySQL中的group by,所以在MongoDB上使用Map/Reduce进行并行统计很容易。 使用MapReduce要实现两个函数Map函数和Reduce函数,Map函数调用emit(key,value),遍历collection中的所有记录,将key和value传递给Reduce函数进行处理。Map函

MongDB的MapReduce相当于MySQL中的“group by”,所以在MongoDB上使用Map/Reduce进行并行“统计”很容易。

使用MapReduce要实现两个函数Map函数和Reduce函数,Map函数调用emit(key,value),遍历collection中的所有记录,将key和value传递给Reduce函数进行处理。Map函数和Reduce函数可以使用JS来实现,可以通过db.runCommand或mapReduce命令来执行一个MapReduce操作。

示例shell

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]
}
);
Copier après la connexion
参数说明:
 mapreduce: 要操作的目标集合。
 map: 映射函数 (生成键值对序列,作为 reduce 函数参数)。
 reduce: 统计函数。
 query: 目标记录过滤。
 sort: 目标记录排序。
 limit: 限制目标记录数量。
 out: 统计结果存放集合 (不指定则使用临时集合,在客户端断开后自动删除)。
 keeptemp: 是否保留临时集合。
 finalize: 最终处理函数 (对 reduce 返回结果进行最终整理后存入结果集合)。
 scope: 向 map、reduce、finalize 导入外部变量。
 verbose: 显示详细的时间统计信息。

下面我们准备数据以备后面示例所需

> db.students.insert({classid:1, age:14, name:&#39;Tom&#39;})
> db.students.insert({classid:1, age:12, name:&#39;Jacky&#39;})
> db.students.insert({classid:2, age:16, name:&#39;Lily&#39;})
> db.students.insert({classid:2, age:9, name:&#39;Tony&#39;})
> db.students.insert({classid:2, age:19, name:&#39;Harry&#39;})
> db.students.insert({classid:2, age:13, name:&#39;Vincent&#39;})
> db.students.insert({classid:1, age:14, name:&#39;Bill&#39;})
> db.students.insert({classid:2, age:17, name:&#39;Bruce&#39;})
>
Copier après la connexion
现在我们演示如何统计1班和2班的学生数量

Map 函数必须调用 emit(key, value) 返回键值对,使用 this 访问当前待处理的 Document。

这里this一定不能忘了!!!

> m = function() { emit(this.classid, 1) }
function () {
emit(this.classid, 1);
}
>
Copier après la connexion
value 可以使用 JSON Object 传递 (支持多个属性值)。例如:
emit(this.classid, {count:1})
Reduce 函数接收的参数类似 Group 效果,将 Map 返回的键值序列组合成 { key, [value1,value2, value3, value...] } 传递给 reduce。
> r = function(key, values) {
... var x = 0;
... values.forEach(function(v) { x += v });
... return x;
... }
function (key, values) {
var x = 0;
values.forEach(function (v) {x += v;});
return x;
}
>
Copier après la connexion
Reduce 函数对这些 values 进行 "统计" 操作,返回结果可以使用 JSON Object。

结果如下:

> res = db.runCommand({
... mapreduce:"students",
... map:m,
... reduce:r,
... out:"students_res"
... });
{
"result" : "students_res",
"timeMillis" : 1587,
"counts" : {
"input" : 8,
"emit" : 8,
"output" : 2
},
"ok" : 1
}
> db.students_res.find()
{ "_id" : 1, "value" : 3 }
{ "_id" : 2, "value" : 5 }
>
Copier après la connexion
mapReduce() 将结果存储在 "students_res" 表中。

利用 finalize() 我们可以对 reduce() 的结果做进一步处理。

> f = function(key, value) { return {classid:key, count:value}; }
function (key, value) {
return {classid:key, count:value};
}
>
Copier après la connexion
我们再重新计算一次,看看返回的结果:
> res = db.runCommand({
... mapreduce:"students",
... map:m,
... reduce:r,
... out:"students_res",
... finalize:f
... });
{
"result" : "students_res",
"timeMillis" : 804,
"counts" : {
"input" : 8,
"emit" : 8,
"output" : 2
},
"ok" : 1
}
> db.students_res.find()
{ "_id" : 1, "value" : { "classid" : 1, "count" : 3 } }
{ "_id" : 2, "value" : { "classid" : 2, "count" : 5 } }
>
Copier après la connexion
列名变与 “classid”和”count”了,这样的列表更容易理解。

我们还可以添加更多的控制细节。

> res = db.runCommand({
... mapreduce:"students",
... map:m,
... reduce:r,
... out:"students_res",
... finalize:f,
... query:{age:{$lt:10}}
... });
{
"result" : "students_res",
"timeMillis" : 358,
"counts" : {
"input" : 1,
"emit" : 1,
"output" : 1
},
"ok" : 1
}
> db.students_res.find();
{ "_id" : 2, "value" : { "classid" : 2, "count" : 1 } }
>
Copier après la connexion
可以看到先进行了过滤,只取age
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

La différence entre nodejs et vuejs La différence entre nodejs et vuejs Apr 21, 2024 am 04:17 AM

Node.js est un environnement d'exécution JavaScript côté serveur, tandis que Vue.js est un framework JavaScript côté client permettant de créer des interfaces utilisateur interactives. Node.js est utilisé pour le développement côté serveur, comme le développement d'API de service back-end et le traitement des données, tandis que Vue.js est utilisé pour le développement côté client, comme les applications monopage et les interfaces utilisateur réactives.

Que faire si Navicat expire Que faire si Navicat expire Apr 23, 2024 pm 12:12 PM

Les solutions pour résoudre les problèmes d'expiration de Navicat incluent : renouveler la licence ; désinstaller et réinstaller ; désactiver les mises à jour automatiques ; utiliser la version gratuite de Navicat Premium ; contacter le support client de Navicat.

Est-il difficile d'apprendre nodejs sur le front-end ? Est-il difficile d'apprendre nodejs sur le front-end ? Apr 21, 2024 am 04:57 AM

Pour les développeurs front-end, la difficulté d'apprendre Node.js dépend de leur base JavaScript, de leur expérience en programmation côté serveur, de leur familiarité avec la ligne de commande et de leur style d'apprentissage. La courbe d'apprentissage comprend des modules d'entrée de gamme et de niveau avancé axés sur les concepts fondamentaux, l'architecture côté serveur, l'intégration de bases de données et la programmation asynchrone. Dans l'ensemble, apprendre Node.js n'est pas difficile pour les développeurs qui ont une base solide en JavaScript et sont prêts à investir du temps et des efforts, mais pour ceux qui manquent d'expérience pertinente, il peut y avoir certains défis à surmonter.

Comment connecter Navicat à MongoDB Comment connecter Navicat à MongoDB Apr 24, 2024 am 11:27 AM

Pour vous connecter à MongoDB à l'aide de Navicat, vous devez : Installer Navicat Créer une connexion MongoDB : a. Entrez le nom de connexion, l'adresse de l'hôte et le port b. Entrez les informations d'authentification (si nécessaire) Ajoutez un certificat SSL (si nécessaire) Vérifiez la connexion. Enregistrez la connexion

Quels sont les modules couramment utilisés dans nodejs ? Quels sont les modules couramment utilisés dans nodejs ? Apr 21, 2024 am 04:34 AM

Les modules les plus couramment utilisés dans Node.js incluent : Module de système de fichiers pour les opérations sur les fichiers. Module réseau pour la communication réseau. Module de flux pour le traitement des flux de données. Module de base de données pour interagir avec les bases de données. D'autres modules utilitaires tels que le chiffrement, les chaînes de requête, l'analyse de chaînes et le framework HTTP.

Quelle base de données est bonne pour nodejs ? Quelle base de données est bonne pour nodejs ? Apr 21, 2024 am 05:06 AM

Pour les applications Node.js, le choix d'une base de données dépend des exigences de l'application. Les bases de données NoSQL MongoDB offrent de la flexibilité, Redis offre une simultanéité élevée, Cassandra gère les données de séries chronologiques et Elasticsearch est dédié à la recherche. La base de données SQL MySQL offre d'excellentes performances, PostgreSQL est riche en fonctionnalités, SQLite est léger et Oracle Database est complet. Lors du choix, tenez compte des types de données, des requêtes, des performances, du caractère transactionnel, de la disponibilité, des licences et du coût.

A quoi sert net4.0 A quoi sert net4.0 May 10, 2024 am 01:09 AM

.NET 4.0 est utilisé pour créer une variété d'applications et offre aux développeurs d'applications des fonctionnalités riches, notamment : programmation orientée objet, flexibilité, architecture puissante, intégration du cloud computing, optimisation des performances, bibliothèques étendues, sécurité, évolutivité, accès aux données et mobile. soutien au développement.

Comment connecter nodejs à la base de données Comment connecter nodejs à la base de données Apr 21, 2024 am 05:07 AM

Étapes pour se connecter à une base de données dans Node.js : Installez le package MySQL, MongoDB ou PostgreSQL. Créez un objet de connexion à la base de données. Ouvrez une connexion à une base de données et gérez les erreurs de connexion.

See all articles