passage d'un objet dans un MapReduce

passage d'un objet dans une fonction reduce pour l'exploiter

a marqué ce sujet comme résolu.

Bonjour, Je test dans MongoDB, la possibilité de faire remonter des objets dans une fonction map pour pouvoir le retravailler dans la fonction reduce. Je démarre avec un objet simple pour compter le nombre de mel d’un agent. 3 parties dans le code. La première partie de mon code n’est là que pour avoir le « bon résultat » La deuxième partie de mon code n’est là que pour avoir le « bon résultat » en utilisant une autre méthode. La troisième partie, j’essaie d’obtenir un résultat analogue mais en passant un objet. Cette troisième partie ne fonctionne pas. je teste sur une collection qui contient deux adresses mel et 79 message pour l'une et 126 pour l'autre. le résultat est une collection de 2 avec en id l'adresse et en value 1.#QNAN0. j'ai essayé de forcer le type, cela ne change rien.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//Partie 1
//Prends le groupe dans l'accumulateur et le traite
db.Resultat.drop();

var mapMel = function() {
              emit(this.EMAIL_AGNT, 1);
    };

var reduceMel = function (melId, source){
    return Array.sum(source);
};
db.MEL.mapReduce(mapMel, reduceMel, {out: "Resultat"} );

db.getCollection('Resultat').find({});

//partie 2
// utilisation de la fonction forEach

db.Resultat.drop();
var mapMel = function() {
              emit(this.EMAIL_AGNT, 1);
    };
var reduceMel = function( melId, source ) {
    var somme = 0;
    source.forEach(function(v) {
            somme +=v;
    });
    return somme;
}
db.MEL.mapReduce(mapMel, reduceMel, {out: "Resultat"} );
db.getCollection('Resultat').find({});

//partie 3
// tentative de passage d'un objet au lieu d'une valeur

db.Resultat.drop();

var mapMel = function() {
    var nombre = {nbre:1};
    emit(this.EMAIL_AGNT, nombre);
    };

var reduceMel = function( melId, source) {
    var somme = 0;
    source.forEach(function(v) {
            //somme +=parseInt(v.nbre);
            somme +=v.nbre;
    });
    return somme;
};

db.MEL.mapReduce(mapMel, reduceMel, {out: "Resultat"} );
db.getCollection('Resultat').find({});
+0 -0

C'est parce que les fonctions map et reduce doivent sortir exactement le même format de donnée. Dans tes 2 premiers exemples, c'est des nombres alors que dans le 3ème example émet un objet {nbre: nombre} alors que reduce retourne un nombre.

Si tu veux fonctionner avec un objet, il faut que reduce retourne aussi un objet (au même format), ici {nbre: somme}.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte