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!

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top