Подсчет документов в MongoDB: 18 способов агрегации

Подсчет количества агрегированных документов в 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 – наиболее эффективный метод, поскольку он выполняется на сервере.

Что будем искать? Например,программа