2012-10-16 5 views
2

je la structure mongodb suivantemongodb - Trouver la somme d'un champ (si elle existe) dans une collection

{ 
    "_id": ObjectId("507c80a143188f9610000003"), 
    "date": ISODate("2012-10-15T21: 31: 13.0Z"), 
    "uid": NumberInt(35920), 
    "comp": NumberInt(770), 
    "fields": { 
    "rating": { 
     "parent": "rating", 
     "weight": NumberInt(2), 
     "rel_weight": 0.11, 
    }, 
    "capacity": { 
     "parent": "capacity", 
     "weight": NumberInt(4), 
     "rel_weight": 0.89, 
    }, 
    } 
} 

Les « champs » attribut a 2 champs « évaluation » et « capacité » en elle. Mais, chaque entrée peut avoir un ensemble de champs différent. par exemple. dimension, prix, etc.

Je voudrais trouver toutes les entrées qui ont "évaluation" sous "champs" et obtenir une somme d'attribut "poids" de toutes ces entrées. Je suis un débutant à mongodb et j'ai essayé d'utiliser la fonction mapReduce, mais sans succès.

Ci-dessous est le code que j'ai utilisé. Veuillez me faire savoir où je me suis trompé ou s'il y a une meilleure solution à la place de ce code.

function map(){ 
    emit(this._id,{weight:this.fields.rating.weight}); 
} 


function reduce(key,value){ 
    var sum = 0; 
    for (var i=0; i<value.length; i++) { 
     sum += value[i].amount; 
    } 
    return sum; 
} 


res = db.collection_name.mapReduce(map, reduce, { query: {"fields.rating" : { $exists: true } }); 

Répondre

0

J'ai finalement été capable de le comprendre et de le faire fonctionner. J'ai partagé mon code ci-dessous.

var map = function(){ 
    if(this.fields.rating){ 
     emit(this.fields.rating.parent,this.fields.rating.weight); 
    } 
} 

var reduce = function (k, vals) { 
    var sum = 0; 
    var count = 0; 
    for (var i in vals) { 
     sum += vals[i]; 
    count++; 
    } 
    var avg = (sum/count); 
    return avg; 
} 

var res = db.myCollection.mapReduce(map, reduce, {out:"myoutput"}); 
Questions connexes