2010-10-07 5 views
5

J'ai une collection MongoDB qui a un created_at stocké dans chaque document. Ceux-ci sont stockés en tant qu'objet de date MongoDB, par ex.-Réduire le nombre de comptage de documents dans chaque minute 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" } 
.... 

Je voudrais compter le nombre d'éléments créés entre chaque minute, donc je peux passer les données dans les graphiques de Google pour générer quelque chose comme ceci:

alt text

Comment puis-je faire avec une fonction de réduction de carte, ou y at-il une fonction d'agrégat MongoDB fantaisie que je pourrais utiliser à la place?

fonction

Répondre

8

de la carte doit émettre un objet d'horodatage, ajusté à la minute, et un nombre de 1. La diminution de la fonction devrait résumer tous les chefs d'accusation:

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 - Testé avec quelques testdata rugueuses, semble faire ce que l'affiche a voulu ... +1 – gnarf

+0

Cela fonctionne un régal, merci! – Tom

0

Vous pouvez également essayer group fonction.


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

où create_at_minute est votre champ create_at arrondi par minutes.

+0

D'où provient create_at_minute, est-ce que mongodb le comprend quand j'exécute cette requête? – Tom

+0

.group() est un moyen plus simple de réaliser l'agrégation, mais il a des limitations. L'objet BSON retourné doit être petit, avec moins de 10K clés, sinon vous obtenez une exception. – rubayeet

+0

10K minutues est d'environ 6 jours ... – walla

Questions connexes