Map-уменьшить количество документов в каждую минуту MongoDB - PullRequest
5 голосов
/ 07 октября 2010

У меня есть коллекция MongoDB, в которой хранится created_at в каждом документе.Они хранятся в виде объекта даты 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" }
....

Я хотел бы посчитать количество элементов, созданных за каждую минуту, чтобы я мог передать данные в Google Charts для генерации чего-то вроде этого:

alt text

Как мне это сделать с помощью функции уменьшения карты, или есть необычная агрегатная функция MongoDB, которую я мог бы использовать вместо этого?

Ответы [ 2 ]

8 голосов
/ 07 октября 2010

Функция карты должна выдавать объект отметки времени, скорректированный с точностью до минуты, и счетчик 1. Функция уменьшения должна суммировать все значения:

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 голосов
/ 07 октября 2010

Вы также можете попробовать функцию group .


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

, где create_at_minute - это ваше поле create_at, округленное до минут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...