2010-10-07 14 views
5

Tengo una colección MongoDB que tiene un created_at almacenado en cada documento. Estos se almacenan como un objeto de fecha MongoDB, p.Mapa: reducir el número de documentos en cada 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" } 
.... 

me gustaría contar el número de elementos creados entre cada minuto, por lo que puede pasar los datos en gráficos de Google para generar algo como esto:

alt text

¿Cómo hago esto con una función de reducción de mapa, o hay una función agregada de MongoDB que podría usar en su lugar?

Respuesta

8

función de mapa debe emitir un objeto de marca de tiempo, ajustado hasta el minuto, y un recuento de 1. La reducir la función deben sumar todos los aspectos:

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 - Probado con algunos datos de prueba aproximada, parece estar haciendo lo que el póster pretendía ... +1 – gnarf

+0

Esto funciona un placer, gracias! – Tom

0

También puede intentar group función.


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

donde create_at_minute es su campo create_at redondeado por minutos.

+0

¿De dónde viene create_at_minute? ¿Funciona mongodb cuando lo ejecuto? – Tom

+0

.group() es una forma más fácil de lograr la agregación, sin embargo, tiene limitaciones. El objeto BSON devuelto debe ser pequeño, con menos de 10 KB de claves, de lo contrario obtendrá una excepción. – rubayeet

+0

Minutos 10K son aproximadamente 6 días ... – walla

Cuestiones relacionadas