Consulta do mongoDB ridiculamente lenta em uma pequena coleção em um banco de dados simples, mas grande

Então eu tenho um banco de dados super simples no mongoDB com algumas coleções:

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

oAggregates coleção é um agregado doPages coleção, e cada documento se parece com isto:

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

Muito simples. No entanto, vamos tentar obter o total de carregamentos de página adicionando todos os 92 diasdaily page loads juntos:

>>> 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 segundos?! ??! ??!?!

Esses 92 resultados agregados são minúsculos! Eu poderia muito bem apenas armazená-los em um arquivo de texto, isso é loucura.

Ou eles são pequenos? Quão grande eles estão no disco de acordo com o 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
}

438 megabytes total para esses pequenos números diários? Cada um tem aproximadamente 280 bytes, então devem ter no máximo 25 ~ 30kb no total. Portanto, o armazenamento é enorme e a consulta é super lenta. É possível que ele possa ser fragmentado no disco? Eu criei os agregados depois de inserir os documentos no totalPages coleção.

Alguém tem alguma idéia sobre essa loucura? : O

Edit: Resolvido com consulta find () mais específica por Jared. O vídeo abaixo que o Sammaye forneceu também oferece alguns insights de armazenamento muito interessantes.

Edit 2: Então eu descobri que usar sys.getsizeof () é umrealmente método não confiável de descobrir o tamanho do seu documento, uma vez que ele não recolhe nenhuma árvore. Então, na verdade, meus documentos eram bem grandes, e a melhor coisa a fazer era usar find ({}, {'daily_page_loads'}) como uma consulta mais específica!

questionAnswers(1)

yourAnswerToTheQuestion