2010-10-07 18 views
5

Ho una raccolta MongoDB che ha uno created_at memorizzato in ciascun documento. Questi sono memorizzati come oggetto data MongoDB, ad es.Mappa: riduce il numero di documenti in ogni minuto MongoDB

{ "_id" : "4cacda7eed607e095201df00", "created_at" : "Wed Oct 06 2010 21:22:23 GMT+0100 (BST)", text: "something" } 
{ "_id" : "4cacdf31ed607e0952031b70", "created_at" : "Wed Oct 06 2010 21:23:42 GMT+0100  (BST)", text: "something" } 
.... 

vorrei contare il numero di elementi creati tra ogni minuto, in modo da poter passare i dati in Google Charts per generare qualcosa di simile:

alt text

Come faccio a fare questo con una mappa riduci la funzione, o c'è una fantasiosa funzione aggregata MongoDB che potrei usare invece?

risposta

8

funzione Map dovrebbe emettere un oggetto timestamp, corretto fino al minuto, e un conteggio di 1. La funzione di riduzione dovrebbe sommare tutti i conteggi:

map = function() { 
    var created_at_minute = new Date(this.created_at.getFullYear(), 
            this.created_at.getMonth(), 
            this.created_at.getDate(), 
            this.created_at.getHours(), 
            this.created_at.getMinutes()); 
    emit(created_at_minute, {count: 1}); 
} 

reduce = function(key, values) { 
    var total = 0; 
    for(var i = 0; i < values.length; i++) { 
     total += values[i].count; 
    } 
    return {count: total}; 
} 
+0

http://pastebin.me/51e1e0f24cb174991ebd9072f1d9bbec - Testato con alcuni testdati approssimativi, sembra fare ciò che il manifesto ha inteso ... +1 – gnarf

+0

Questo funziona a meraviglia, grazie! – Tom

0

Si può anche provare group funzione.


db.stat.group({key:{"create_at_minute":true} 
       ,initial:{count:0} 
       ,reduce:function(doc,out){out.count++}}) 

dove create_at_minute è il campo create_at arrotondato da minuti.

+0

Da dove proviene create_at_minute, mongodb capisce quando eseguo quella query? – Tom

+0

.group() è un modo più semplice per ottenere l'aggregazione, tuttavia presenta delle limitazioni. L'oggetto BSON restituito deve essere piccolo, con meno di 10.000 chiavi, altrimenti si ottiene un'eccezione. – rubayeet

+0

minuti 10K è di circa 6 giorni ... – walla

Problemi correlati