Pregunta

¿Cómo puedo ejecutar agregado, min, max, suma? y amigos ¿Sobre documentos incrustados?

Por ejemplo:

Obtenga el costo promedio de todos los eventos que tiene un distrito, donde están bastante profundamente integrados.

District.schools.all.events.all.costs.avg(:value)

Obviamente no funciona.

District.avg('schools.events.costs.value')

Tampoco lo hace eso. Da este mensaje de error:

Mongo::OperationFailure: Database command 'group' failed: (errmsg: 'exception: reduce
invoke failed: JS Error: TypeError: obj.schools 
has no properties reduce setup:1'; code:   '9010'; ok: '0.0').

Entonces, ¿es posible o necesito escribir mi propio mapa/reducir las funciones?

¿Fue útil?

Solución

Sí, MapReduce funcionaría. También puede usar cursores para procesar un resultado de la consulta. Me gusta:

min = 99999999;
max = -99999999;
sum = 0;
count = 0
db.School.find({}).forEach(function(s) {
    if (s.first.events.first.cost < min)
        min = s.first.events.first.cost;
    if (s.first.events.first.cost > max)
        max = s.first.events.first.cost;
    sum += s.first.events.first.cost;
    ++count;
});

Ahora tiene el Min y Max y puede calcular el promedio y la media a partir de la suma y el recuento.

MongoDB no tiene la capacidad de calcular las funciones agregadas en su lenguaje de consulta directamente. En realidad, esa declaración no es del todo cierta, ya que existe la función Count () para contar el número de resultados devueltos por una consulta, y existe la función Group (). Pero la función de grupo se parece mucho a una mapreduce, y no se puede usar en bases de datos fragmentadas. Si está interesado en la función de grupo, consulte: http://www.mongodb.org/display/docs/aggregation#aggregation-group

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top