Mongodb aggregation — почему так медленно?

Всем добрый вечер!
Есть ограниченная коллекция:
db.createCollection("Error", {capped:true, size:419430400, max:200000})

В коллекции хранятся ошибки разного типа с разных серверов.
Необходимо подсчитать количество ошибок каждого типа на каждом сервере за последние сутки.

Мой вариант запроса:
db.Error.aggregate (
    [
        {
            "$match" : {
                "dateAdd" : {
                    "$gt" : ISODate("2014-05-11T13:16:52Z"),
                    "$lte" : ISODate("2014-05-12T13:16:52Z")
                }
            }
        },
        {
            "$group" : {
                "_id" : {
                    "server" : "$server",
                    "errorType" : "$errorType"
                },
                "count" : {
                    "$sum" : NumberLong(1)
                }
            }
        }
    ]
)

При максимально заполненной коллекции (200000 ошибок) запрос выполняется 0.5 секунды.
Индекс, судя по explain, подхватывается.
Существующие индексы:
db.Error.ensureIndex({web:1, hash:1, dateAdd:1});
db.Error.ensureIndex({type:1, dateAdd:1})
db.Error.ensureIndex({web:1, type:1, dateAdd:1});
db.Error.ensureIndex({dateAdd:1})
  • Вопрос задан
  • 2968 просмотров
Пригласить эксперта
Ответы на вопрос 1
FuN_ViT
@FuN_ViT
веб-разработчик
вариант решения - фоновая задача, которая раз в день запускает aggregation и сохраняет результаты в доп. коллекцию.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы