Если я выполняю запрос на подсчет, я получаю результаты за ‹2 секунды.
db.coll.find({"A":1,"createDate":{"$gt":new Date("2011-05-21"),"$lt":new Date("2013-08-21")}}).count()
При этом используется следующий индекс
db.coll.ensureIndex({"A":1,"createDate":1})
Точно так же есть 4 столбца A, B, C, D (значения всегда равны 0 или 1), для которых я запускаю 4 запроса на подсчет и получаю результаты за ‹10 секунд.
Я просмотрел документацию по структуре агрегации и создал агрегированный запрос, чтобы выполнить все 4 суммы вместе.
db.coll.aggregate( { $match : {"createDate":{$gt:new Date("2013-05-21"),$lt:new Date("2013-08-21")} } },
{ $group :
{ _id:null,
totalA : { $sum : "$A" },
totalB : {$sum: "$B},
totalC:{$sum: "$C"},
totalD:{$sum: "$D"}}}
)
Я также создал индекс:
db.coll..ensureIndex({"createDate":1,"A":1,"B":1,"C":1,"D":1})
Согласно документации, этот индекс охватывает мою агрегатную функцию. Но возврат агрегата происходит через ~ 18 секунд.
Я смущен здесь. Есть ли что-то основное, что я пропустил, или есть какая-то фундаментальная концепция, которая делает агрегацию медленнее, чем подсчет. Я также обеспокоен накладными расходами из-за количества запросов, которые должны быть запущены из монго из кода для получения подсчета.