Question

Je collecte des statistiques à partir d'un service Web, et de le stocker dans une collection. Les données ressemble à ceci (mais avec plus de champs):

{"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 quelqu'un demande le nombre quotidien des trente derniers jours, cela signifierait le montant maximum de (dans cet exemple) « téléchargements » pr. journée. Quel est le dernier enregistrement de la journée.

En utilisant collection.find({"dt": {"$gt": datetime_obj_30_days_ago}}), I get bien sûr toutes les lignes, ce qui est pas très approprié. Donc, je suis à la recherche d'un moyen de revenir seulement le dernier jour pour la période donnée.

On m'a dit que group() pourrait être le chemin à parcourir, mais je ne comprends pas bien comment le faire fonctionner dans ce cas.

Des conseils, des pointeurs seraient très appréciés!

Était-ce utile?

La solution

Vous pouvez le faire en utilisant groupe . Dans votre exemple, vous auriez besoin de fournir une fonction javascript pour calculer la clé (et la diminution de la fonction), parce que vous voulez que la composante date du champ datetime. Cela devrait fonctionner:

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

Gardez à l'esprit qui fait encore un balayage linéaire du mois passé, juste sur le serveur au lieu du client. Il est possible qui sélectionnant simplement la valeur maximale de chaque jour est plus rapide individuellement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top