2010-10-07 10 views
5

Mam kolekcję MongoDB, która ma created_at przechowywany w każdym dokumencie. Są one przechowywane jako obiekt daty MongoDB, np.Map-Zmniejszenie liczby dokumentów w każdej minucie 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" } 
.... 

chciałbym policzyć liczbę elementów utworzonych pomiędzy każdą minutę, więc mogę przekazać dane na wykresach Google wygenerować coś takiego:

alt text

Jak to zrobić z funkcją zmniejszania mapy, czy też istnieje fantazyjna funkcja agregująca MongoDB, którą mógłbym zamiast tego użyć?

Odpowiedz

8

funkcja Map powinien emitować obiekt datownika, dostosowane do chwili, oraz liczbę 1. Funkcja zmniejszenia powinny sumują wszystkie liczniki:

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 - Przetestowany z niektórymi próbnymi danymi, wydaje się robić to, co zamierzał plakat ... +1 – gnarf

+0

To działa gratka, dziękuję! – Tom

0

Możesz także spróbować group funkcję.


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

gdzie create_at_minute to create_at pole zaokrąglone przez minut.

+0

Skąd pochodzi nazwa create_at_minute, czy mongodb ją wykrywa po uruchomieniu zapytania? – Tom

+0

.group() to łatwiejszy sposób na osiągnięcie agregacji, jednak ma on ograniczenia. Zwrócony obiekt BSON musi być mały, z mniej niż 10K kluczy, w przeciwnym razie pojawi się wyjątek. – rubayeet

+0

10 minut to około 6 dni ... – walla

Powiązane problemy