Руководство по MongoDB. Агрегация.

В данной статье мы рассмотрим механизм агрегации в MongoDB.

Агрегация – это группировка значений многих документов. Операции агрегирования позволяют манипулировать такими сгруппированными данными (например, подсчёт – COUNT(*)). В MySQL аналогом агрегации является команда group by.


Метод aggregate()

В MongoDB для агрегации используется метод aggregate(). Данный метод имеет следующий синтаксис:


db.ИМЯ_КОЛЛЕКЦИИ.aggregate(ОПЕРАЦИЯ_АГРЕГАЦИИ)

Для понимания того, как это работает на практике, рассмотрим простой пример:
Предположим, что у нас есть коллекция developers, которая содержит следующие документы:


> db.developers.find().pretty()
{
	"_id" : ObjectId("5815f4e735ee883c37ac8b4d"),
	"title" : "Eugene Suleimanov",
	"specialty" : "Java",
	"skills" : [
		"Java",
		"Hibernate",
		"Spring"
	],
	"salary" : 3500
}
{
	"_id" : ObjectId("5815f4ec35ee883c37ac8b4e"),
	"title" : "Ivan Ivanov",
	"specialty" : "Java",
	"skills" : [
		"Java",
		"Hibernate",
		"Spring"
	],
	"salary" : 3500
}
{
	"_id" : ObjectId("5815f4f535ee883c37ac8b4f"),
	"title" : "Nikolay Nikolaev",
	"specialty" : "C++",
	"skills" : [
		"C++",
		"STL",
		"SQL"
	],
	"salary" : 3500
}

Допустим, что нам необходимо вычислить общую зарплату всех разработчиков в коллекции. Для этого мы можем использовать следующий запрос:


> db.developers.aggregate( [ {$group :{ _id : "Developers", total_salary: { $sum : "$salary" }}} ] )

{ "_id" : "Developers", "total_salary" : 10500 }

Ниже приведён список операций для агрегации документов:

Выраженеие Описание Пример
$sum Суммирует указанные значения всех документов в коллекции. db.ИМЯ_КОЛЛЕКЦИИ.aggregate([{$group : {_id : “$title”, total_salary : {$sum : “$salary”}}}])
$avg Рассчитывает среднее значение указанного поля поля для всех документов коллекции. db.ИМЯ_КОЛЛЕКЦИИ.aggregate([{$group : {_id : “$title”, avg_salary : {$avg : “$salary”}}}])
$min Получает минимальное значение указанного поля документа в коллекции db.ИМЯ_КОЛЛЕКЦИИ.aggregate([{$group : {_id : “$title”, min_salary : {$min : “$salary”}}}])
$max Получает максимальное значение указанного поля документа в коллекции db.ИМЯ_КОЛЛЕКЦИИ.aggregate([{$group : {_id : “$title”, max_salary : {$max : “$salary”}}}])
$push Вставляет значение в массив в результирующем документе. db.ИМЯ_КОЛЛЕКЦИИ.aggregate([{$group : {_id : “$title”, skills : {$push: “$skills”}}}])
$addToSet Вставляет значение в массив в результирующем документе, но не создаёт дубликаты. db.ИМЯ_КОЛЛЕКЦИИ.aggregate([{$group : {_id : “$title”, skills : {$addToSet : “$skills”}}}])
$first Получает первый документ из сгруппированных. Обычно используется вместе с сортировкой. db.ИМЯ_КОЛЛЕКЦИИ.aggregate([{$group : {_id : “$title”, first_skill : {$first : “$skills”}}}])
$last Получает крайний документ из сгруппированных. Обычно используется вместе с сортировкой. db.ИМЯ_КОЛЛЕКЦИИ.aggregate([{$group : {_id : “$title”, last_skill : {$last : “$skills”}}}])

Концепция “Трубопровода”

В UNIX-системах данная концепция означает возможность выполнения операции над некоторым вводом и использования вывода, как ввода для следующей команды. MongoDB также поддерживает данную концепцию. Ниже приведён список возможных этапов и каждый из них может быть взят, как множество документов для ввода и сгенерировать  набор документов, полученных в результате обработки:

  • $project
    Используется для выбора некоторых специальных полей из коллекции.
  • $match
    Операция фильтрации, которая может уменьшить количество документов, которые передаются для ввода в следующий этап.
  • $group
    Непосредственно, сама агрегация
  • $sort
    Сортирует документы
  • $skip
    С помощью данной команды мы можем проигнорировать список документов в имеющемся множестве.
  • $limit
    Ограничивает количество документов для вывода на количество, переданное методу, начиная, с текущей позиции.
  • $unwind
    Используется для “разматывания” документов, который используют массивы.

На этом мы заканчиваем изучение агрегации в MongoDB.

В следующей статье мы рассмотрим процесс репликации (синхронизации) данных в MongoDB.