Pregunta

Estoy reuniendo algunas estadísticas de un servicio Web, y almacenarlo en una colección. Los datos se parece a esto (pero con más campos):

{"downloads": 30, "dt": "2010-02-17T16:56:34.163000"}
{"downloads": 30, "dt": "2010-02-17T17:56:34.163000"}
{"downloads": 30, "dt": "2010-02-17T18:56:34.163000"}
{"downloads": 30, "dt": "2010-02-17T19:56:34.163000"}
{"downloads": 30, "dt": "2010-02-17T20:56:34.163000"}
{…}
{"downloads": 30, "dt": "2010-02-18T17:56:34.163000"}
{"downloads": 30, "dt": "2010-02-18T18:56:34.163000"}
{"downloads": 30, "dt": "2010-02-18T19:56:34.163000"}
{"downloads": 30, "dt": "2010-02-18T20:56:34.163000"}

Si alguien solicita los números diarias de los últimos treinta días, eso significaría que la cantidad máxima de (en este ejemplo) 'descargas' pr. día. Que es el último registro del día.

Mediante el uso de collection.find({"dt": {"$gt": datetime_obj_30_days_ago}}), que, por supuesto, obtener todas las filas, que no es muy adecuado. Así que estoy buscando una manera de devolver sólo el último del día para el periodo indicado.

Me dijeron que group() podría ser el camino a seguir, pero no acabo de entender cómo conseguir que funcione en este caso.

Cualquier consejo, indicador sería muy apreciada!

¿Fue útil?

Solución

Puede hacer esto utilizando grupo . En el ejemplo que había necesidad de suministrar una función javascript para calcular la clave (además de la función de reducir), ya que desea sólo el componente de fecha del campo de fecha y hora. Esto debería funcionar:

db.coll.group(
    key='function(doc) { return {"dt": doc.dt.toDateString()} }',
    condition={'dt': {'$gt': datetime_obj_30_days_ago}},
    initial={'downloads': 0},
    reduce='function(curr, prev) { prev.downloads = Math.max(curr.downloads, prev.downloads) }'
)

Tenga en cuenta que todavía hace una exploración lineal del mes pasado, justo en el servidor en lugar del cliente. Es posible que simplemente seleccionando el valor máximo de cada día de forma individual es más rápido.

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