Подсчет количества агрегированных документов в MongoDB можно выполнить различными методами. Рассмотрим несколько примеров, используя коллекцию persons, содержащую 1000 документов.
Методы подсчета документов
Преобразование курсора в массив
Вызов метода aggregate без этапов агрегации возвращает курсор, содержащий все 1000 документов. Преобразование этого курсора в массив с помощью метода toArray и последующее использование свойства length позволяет получить количество документов. Эта операция занимает приблизительно 1,7 секунды.
db.persons.aggregate([])
.toArray()
.then(result => console.log(result.length)); // Выведет 1000
Метод count() курсора
Метод count() курсора подсчитывает все документы в курсоре. Время выполнения – около 1,4 секунды, результат – 1000.
db.persons.aggregate([]).count(); // Выведет 1000
Этап $count в агрегации
Использование этапа $count в агрегации:
db.persons.aggregate([{ $count: "total" }]); // Выведет { "total" : 1000 }
Эта операция занимает около 200 миллисекунд и возвращает объект с ключом total и значением – количеством документов (1000).
Сравнение методов
Первые два метода (преобразование в массив и count() курсора) – клиентские методы. Они перебирают курсор до конца на стороне клиента, что значительно увеличивает время выполнения. Третий метод (этап $count) выполняется на сервере и возвращает только результат подсчета, без самих документов, что делает его значительно быстрее.
Сравнение с методом count() в find()
Сравним этап $count в агрегации (200 миллисекунд) с методом count() в методе find() с пустым запросом:
db.persons.find({}).count(); // Выведет 1000
Оба метода выполняются на сервере и занимают одинаковое время. Метод count() в find() является обёрткой над этапом $count в агрегации. В первом случае сервер возвращает объект { total: 1000 }, во втором – число 1000.
Для подсчета количества агрегированных документов следует использовать этап $count. Методы toArray().length и count() курсора значительно менее эффективны, так как выполняются на стороне клиента. Этап $count – наиболее эффективный метод, поскольку он выполняется на сервере.