Śmiesznie powolne zapytanie mongoDB na małej kolekcji w prostej, ale dużej bazie danych

Mam więc bardzo prostą bazę danych w mongoDB z kilkoma kolekcjami:

> show collections
Aggregates <-- count: 92
Users <-- count: 68222
Pages <-- count: 1728288847, about 1.1TB
system.indexes

TheAggregates kolekcja jest agregatemPages kolekcja, a każdy dokument wygląda tak:

> db.Aggregates.findOne()
{
        "_id" : ObjectId("50f237126ba71610eab3aaa5"),
        "daily_total_pages" : 16929799,
        "day" : 21,
        "month" : 9,
        "year" : 2011
}

Bardzo prosty. Spróbujmy jednak uzyskać łączne obciążenie strony, dodając wszystkie 92 dnidaily page loads razem:

>>> def get_total():
...     start = datetime.now()
...     print sum([x['daily_total_pages'] for x in c.Aggregates.find()])
...     end = datetime.now()
...     print (end-start).seconds
...
>>> get_total()
1728288847
43

43 sekundy?! ??! ??!?!

Te 92 zagregowane wyniki są niewielkie! Równie dobrze mogę je przechowywać w pliku tekstowym, to jest szalone.

Czy są małe? Jak duże są na dysku według mongo?

> db.Aggregates.stats()
{
        "ns" : "c.AggregateResults",
        "count" : 92,
        "size" : 460250104,
        "avgObjSize" : 5002718.521739131,
        "storageSize" : 729464832,
        "numExtents" : 7,
        "nindexes" : 2,
        "lastExtentSize" : 355647488,
        "paddingFactor" : 1.0690000000000066,
        "systemFlags" : 1,
        "userFlags" : 0,
        "totalIndexSize" : 16352,
        "indexSizes" : {
                "_id_" : 8176,
                "date_1" : 8176
        },
        "ok" : 1
}

Łącznie 438 megabajtów na te małe dzienne liczby? Każdy z nich ma około 280 bajtów, a więc powinien wynosić maksymalnie 25 ~ 30kb. Pamięć jest ogromna, a zapytanie jest bardzo powolne. Czy to możliwe, że może być pofragmentowane na dysku? Agregaty utworzyłem po wstawieniu dokumentów do pełnej wersjiPages kolekcja.

Czy ktoś ma wgląd w to szaleństwo? : O

Edytuj: Rozwiązany za pomocą bardziej szczegółowego zapytania find () od Jareda. Poniższy film wideo dostarczony przez Sammaye dostarcza również bardzo interesujących informacji dotyczących przechowywania.

Edytuj 2: Więc dowiedziałem się, że użycie sys.getsizeof () tonaprawdę niewiarygodna metoda ustalania rozmiarów twojego dokumentu, ponieważ nie powtarza żadnych drzew. Tak więc moje dokumenty były dość duże i najlepiej było użyć find ({}, {'daily_page_loads'}) jako bardziej szczegółowego zapytania!

questionAnswers(1)

yourAnswerToTheQuestion