Смешно медленный запрос mongoDB для небольшой коллекции в простой, но большой базе данных

Итак, у меня есть супер простая база данных в mongoDB с несколькими коллекциями:

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

Aggregates Коллекция является совокупностьюPages коллекция, и каждый документ выглядит так:

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

Очень простой. Тем не менее, давайте попробуем получить общую загрузку страницы, добавив все 92 дняdaily page loads все вместе:

>>> 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 секунды?! ??! ??!?!

Эти 92 совокупных результата крошечные! Я мог бы просто хранить их в текстовом файле, это безумие.

Или они крошечные? Насколько они велики на диске согласно Монго?

> 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
}

Всего 438 мегабайт для этих крошечных ежедневных цифр? Каждый из них имеет размер около 280 байт, поэтому их максимальный размер должен составлять 25 ~ 30 КБ. Так что хранилище огромно, а запрос супер медленный. Возможно ли, что это может быть фрагментировано на диске? Я создал агрегаты после вставки документов в полныйPages коллекция.

У кого-нибудь есть понимание этого безумия? : O

Редактировать: Решено с помощью более конкретного запроса find () Джареда. Видео ниже, которое предоставил Саммайе, также дает некоторые очень интересные идеи хранения.

Редактировать 2: Итак, я обнаружил, что использование sys.getsizeof () являетсядействительно ненадежный метод определения размеров вашего документа, так как он не обрабатывает деревья. Так что на самом деле мои документы были довольно большими, и лучше всего было использовать find ({}, {'daily_page_loads'}) в качестве более конкретного запроса!

Ответы на вопрос(1)

Ваш ответ на вопрос