operadores - sumar un campo en mongodb
mongodb-Encontrar la suma de un campo(si existe) en una colección (1)
Finalmente pude descifrarlo y ponerlo en funcionamiento. He compartido mi código a continuación.
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"});
Tengo la siguiente estructura mongodb
{
"_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,
},
}
}
El atributo "fields" tiene 2 campos "rating" y "capacity" en él. Pero, cada entrada puede tener un conjunto diferente de campos. p.ej. dimensión, precio, etc.
Me gustaría encontrar todas las entradas que tienen "calificación" en "campos" y obtener una suma del atributo "peso" de todas esas entradas.
Soy un novato en mongodb y traté de usar la función mapReduce, pero fue en vano.
A continuación se muestra el código que utilicé. Por favor, hágamelo saber dónde me salió mal o si hay una solución mejor en lugar de este código.
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 } });