2010-02-18 4 views
3

Je rassemble des statistiques d'un service Web et les stocke 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 record de la journée. En utilisant collection.find({"dt": {"$gt": datetime_obj_30_days_ago}}), j'obtiens bien sûr toutes les lignes, ce qui n'est pas très approprié. Donc, je cherche un moyen de ne retourner que le dernier jour de la période donnée.

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

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

Répondre

1

Vous pouvez le faire en utilisant group. Dans votre exemple, vous devez fournir une fonction javascript pour calculer la clé (ainsi que la fonction de réduction), car vous ne voulez que le composant 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. C'est possible que simplement sélectionner la valeur maximale de chaque jour individuellement est plus rapide.

+0

Merci beaucoup, Coady - vous venez d'élargir ma compréhension de 'group'. :-) –

Questions connexes