В данной статье мы рассмотрим механизм агрегации в 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.