2017-08-19 3 views
0

Je suis en train d'effectuer MapReduce sur ce genre de jeu de données:Pymongo MapReduce comme somme de l'élément sous-tableau

{ 
"_id": "599861ce7ce78cd973746906", 
"name": "Macias Rosario", 
"col": [ 
    { 
    "date": "15/03/2016", 
    "name": "MAGNEATO", 
    "amount": 313.86 
    }, 
    { 
    "date": "08/08/2016", 
    "name": "FORTEAN", 
    "amount": 151.06 
    }, 
    { 
    "date": "05/11/2014", 
    "name": "ECRATIC", 
    "amount": 291.68 
    } 
] 

}

L'objectif est de résumer tout montant pour le nom Macias Rosario. À l'heure actuelle, je l'ai fait avec mon code pour regrouper tous par sous-éléments this.col.name sur cette façon:

mapper = Code(""" 
          function() { 
          for (var index = 0; index < this.col.length; ++index) { 
           var col = this.col[index]; 
           emit(col.name, col.amount); 
          } 
          } 
          """) 
     reducer = Code(""" 
          function(key, values) { 
           var total = 0; 
           for(var i = 0; i < values.length; ++i){ 
            total += values[i]; 


           } 
           return value.price; 
          } 
       """) 
     result = collection.map_reduce(mapper, reducer, "myresult") 

Quelqu'un at-il avoir une idée comment référencer, ou d'un groupe par this.name et non this.col.name parce que je ne sais plus et je suis conduire des écrous? PS ne me suggère pas d'utiliser aggregate, a fait de cette façon, essayer de cette façon aussi :) Cordialement,

Répondre

0

J'espère que le code suivant aide (œuvres à pymongo ainsi)

Cette est ma fonction de carte:

var mapFunction = function() { 
    for (var idx = 0; idx < this.col.length; idx++) { 
     var key = this.name; 
     var value = { amount : this.col[idx].amount }; 
     emit(key, value); 
    } 
}; 

Et ce qui suit est ma fonction reduce:

var reduceFunction = function(key, amountVl) { 
    reduceVal = { amount : 0 }; 
    for (var idx = 0; idx < amountVl.length; idx++) { 
     reduceVal.amount += amountVl[idx].amount; 
    } 
    return reduceVal; 
} 

Avec vos données échantillon, il produ ces:

{ "_id" : "Macias Rosario", "value" : { "amount" : 756.6 } }