MongoDB: Limitare i risultati di una query $ gt (da pymongo)
Domanda
Sono la raccolta di alcune statistiche da un servizio Web, e riporlo in una collezione. Il dato è simile a questo (ma con più campi):
{"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"}
Se qualcuno richiede i numeri al giorno per gli ultimi trenta giorni, ciò significherebbe l'importo massimo di (in questo esempio) 'download' pr. giorno. Qual è l'ultimo record della giornata.
Utilizzando collection.find({"dt": {"$gt": datetime_obj_30_days_ago}})
, io naturalmente ottenere tutte le righe, che non è molto adatto. Quindi sto cercando un modo per restituire solo l'ultimo della giornata per il periodo specificato.
Mi è stato detto che group()
potrebbe essere la strada da percorrere, ma io non riesco a capire come farlo funzionare in questo caso.
Eventuali suggerimenti, puntatori sarebbe molto apprezzato!
Soluzione
È possibile farlo utilizzando gruppo . Nel tuo esempio avresti bisogno di fornire una funzione javascript per calcolare la chiave (come pure la funzione di ridurre i), perché si desidera solo la componente data del campo datetime. Questo dovrebbe funzionare:
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) }'
)
Tenete a mente che fa ancora una scansione lineare del mese scorso, proprio sul server al posto del cliente. E ' possibile che semplicemente selezionando il valore massimo di ogni giorno individualmente è più veloce.