Всем добрый вечер!
Есть ограниченная коллекция:
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})