Frage

Ich sammle Statistiken von einem Webdienst, und es ist in einer Sammlung zu speichern. Die Daten sehen wie folgt aus (aber mit mehreren Feldern):

{"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"}

Wenn jemand die täglichen Zahlen für die letzten 30 Tage beantragt, das würde bedeuten, die maximale Menge an (in diesem Beispiel) ‚Downloads‘ pr. Tag. Welches ist der letzte Datensatz des Tages.

Mit dem collection.find({"dt": {"$gt": datetime_obj_30_days_ago}}) verwenden, habe ich natürlich alle Zeilen erhalten, die nicht sehr geeignet ist. Also ich bin für einen Weg, um nur die letzte Rückkehr des Tages für den angegebenen Zeitraum an.

Mir wurde gesagt, dass group() könnte der Weg zu gehen, aber ich kann nicht ganz verstehen, wie es in diesem Fall arbeiten erhalten.

Irgendwelche Tipps, würden Zeiger sehr geschätzt!

War es hilfreich?

Lösung

können Sie tun dies mit Gruppe . In Ihrem Beispiel müssen Sie eine JavaScript-Funktion liefern den Schlüssel (wie auch die Verringerung Funktion) zu berechnen, da Sie nur das Datum Komponente des Datetime-Feldes wollen. Dies sollte funktionieren:

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) }'
)

Beachten Sie, dass tut immer noch eine lineare Abtastung des vergangenen Monats, nur auf dem Server anstatt des Kunden. Es ist möglich , dass einfach die Auswahl des Maximalwert eines jeden Tages individuell ist schneller.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top