Soy relativamente novato en MongoDB, pero por lo que he leído hay varios métodos para encontrar promedios y sumas de valores en una base de datos MongoDB, con varios beneficios y desventajas para cada uno.'AVG' y la funcionalidad 'SUM' en MongoDB, ¿algún consejo?
Estoy principalmente pidiendo un método para encontrar la suma de una selección de valores, y la media de una selección de valores, en un método tan eficiente (rápido) como sea posible.
Los documentos de la colección que se está consultando asemejan a esta estructura (con una gran cantidad de otros campos):
{
"_id": ObjectId('4e650107580fd649e5000005'),
"date_added": ISODate("2011-09-05T00:00:00Z"),
"value": 1500
}
puede calcular previamente cosas como sumas es, en mi solicitud, no siempre es posible, ya que la selección de valores para Sumarse puede cambiar (en función de los intervalos de fechas, por ejemplo, entre una fecha de inicio y una fecha de finalización, cuál es el promedio). Este es un problema similar con promedios precalculados.
Por lo que he leído, MapReduce definitivamente no es ideal para la búsqueda en tiempo real (es decir, a pedido), por lo que parece estar fuera de cuestión también.
En este momento estoy consultando la colección de esta manera: (Nota: esto es usar pymongo
)
response = request.db['somecollection'].find(
{
'date_added': {
'$gte': date_start,
'$lte': date_end
}
},
{
'value':1
}
).limit(500)
Entonces se hizo el cálculo en Python usando un bucle for
sobre la respuesta. El límite de 500 resultados es arbitrario, para evitar que se vuelva demasiado lento. Solo estoy recuperando el valor y ninguno de los otros campos.
¿Es este el método más eficiente de hacer este cálculo, o hay otros métodos para lograr lo que necesito?
Advertencias:
- No puedo usar la función
group
porque probablemente va a utilizar en el futuro sharding - no puedo usar MapReduce porque es una función que se utiliza en -la marcha por los usuarios
- no puedo precalcular muchos de mis sumas/medias debido a que la selección de valores para resumir/media es casi siempre diferente
- he mirado alrededor stackoverflow y la web para tratar de encontrar recomendaciones sobre la manera de hacer este tipo de cosas, y es bastante abierto-
EDIT:
Debo señalar que el número de documentos de regresar de la consulta que he publicado anteriormente podría ser cualquier cosa de 1 documento a cientos, pero probablemente tendrá un número máximo de documentos devueltos de alrededor de 150 (promedio de alrededor de 60 o 70)
Definitivamente voy a experimentar más con MapReduce. Sé que va a variar entre conjuntos de datos/consultas/etc., pero en su caso fue lo suficientemente rápido como para no ser realmente notable para el usuario (es decir, menos de medio segundo)? – johneth
Varía entre 500 y 5000 ms, pero algunos de los conjuntos de datos eran bastante grandes (más de 100 millones de documentos), por lo que necesitaban un indicador de ocupado/progreso, pero lo suficientemente rápido. El rendimiento de reducción de mapas también debería mejorar cuando el motor de JavaScript se actualiza desde SpiderMonkey de subproceso único a V8. –
Ah, eso suena prometedor. Por el momento, mi conjunto de datos es muy pequeño (medido en miles, no en millones), aunque esto crecerá con el tiempo. – johneth