Статья о конвейере агрегирования и функциях в базе данных MongoDB

MongoDB - база данных NoSQL

Прежде чем узнать о MongoDB, мы должны узнать, что такое база данных NoSQL и чем она отличается от других популярных типов баз данных SQL.

Базы данных NoSQL называются «нереляционными» базами данных, тогда как базы данных SQL называются реляционными базами данных, потому что таблица в базе данных SQL может быть связана с другой таблицей, но в случае базы данных NoSQL это не обязательно, потому что у нее есть свои владеть, чтобы достичь того, что делает SQL.

База данных содержит несколько таблиц, а конкретная таблица содержит столбцы или поля, и каждая строка представляет собой отдельные данные. В таблице SQL все данные имеют одинаковую схему, это означает, что после инициализации таблицы вставляемые данные должны иметь все поля, изображенные в таблице, даже если значения для некоторых полей отсутствуют, эти поля заполняются с данными "NULL". То есть поля статичны. Но в случае NoSQL вставляемые данные не обязательно должны содержать все поля, то есть поля являются динамическими. Это один из наиболее важных факторов, отличающих NoSQL от базы данных SQL.

MongoDB - широко используемая и популярная база данных NoSQL во всем мире. Некоторые из других баз данных NoSQL - это Redis, Cassandra, Apache CouchDB, и этот список можно продолжить.

О чем эта статья

Эта статья не является введением в MongoDB. Если вы новичок в MongoDB, я настоятельно рекомендую вам сначала прочитать эту статью, чтобы понять MongoDB и его основные функции.

Эта статья посвящена функциям «агрегирования» в MongoDB, которые широко используются для запросов и анализа данных. В этой статье мы обсудим часто используемые агрегатные функции, такие как $ match, $ group, $ count, $ sum и т. Д.

MongoDB можно скачать здесь. После установки добавьте двоичные переменные в среду пользователя. Рабочая среда - 64-битная Windows и графический интерфейс Studio 3T для операций MongoDB. Убедитесь, что вы запустили сеанс mongo, чтобы запустить Studio 3T. Без дальнейших обязательств, приступим.

Трубопровод агрегации

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

Агрегация группирует документы в коллекцию и используется для предоставления таких результатов, как общее количество документов, сумма, среднее, максимальное и минимальное значения. Для людей, знакомых с SQL, этапы агрегирования MongoDB аналогичны этапам COUNT (), SUM (), GROUP BY, LIMIT и т. Д. В SQL.

Базовый синтаксис конвейера агрегации следующий.

db.<collection_name>.aggregate([])

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

Таким образом, агрегация в MongoDB работает путем объединения одной или нескольких функций.

Соответствие документов

Мы можем отфильтровать документы на основе заданных нами критериев, используя этап $ match в конвейере агрегирования, чтобы обрабатывать только те документы, которые нас интересуют. Это аналог предложения WHERE в SQL. Давайте посмотрим на это в действии.

У меня уже есть коллекция под названием Restaurants в базе данных1 с такими полями, как _id, имя, адрес, рейтинг, type_of_food и т. Д.

Теперь, если мы хотим обработать документы с рейтингом, скажем 5, мы можем отфильтровать его следующим образом.

db.restaurants.aggregate([{$match: {"rating": 5}}])

Как вы можете видеть на изображении, мы успешно получили только те документы, которые имеют рейтинг 5.

Группировка документа

Когда нам нужно провести анализ группы данных, мы можем использовать этап агрегирования $ group. Таким образом, мы можем выполнять анализ данных, сгруппированных по некоторым характеристикам. Это похоже на предложение GROUP BY в SQL.

Давайте посчитаем количество ресторанов на основе type_of_food, который они предоставляют.

db.restaurants.aggregate([{$group: {_id: "$type_of_food", count: {$sum: 1}}}])

Это упорядочивает документы по полям type_of_food и подсчитывает количество ресторанов в каждой категории. Как видите, есть два ресторана, которые подпадают под категорию «Pick n Mix». Так, шесть ресторанов подпадают под категорию «Азербайджан». «_Id» и «count» - это поля, которые мы указываем, где «count» нет в коллекции. «Count» использует оператор $ sum для суммирования «1» самому себе, когда встречается в каждом документе в категории type_of_food.

Давайте посмотрим на цепочку «$ match» и «$ group».

db.restaurants.aggregate([{$match: {rating: 5.5}}, {$group: {_id: "$type_of_food", count: {$sum: 1}}}]) это дает результат, в котором рейтинг равен 5,5, а затем подсчитывается количество ресторанов в каждом «типе_продукта».

Проектирование полей в документе

Если мы не хотим отображать все столбцы после обработки, мы можем опустить поля, используя этап «$ project». Синтаксис следующий.

db.<collection_name>.aggregate([{$project: {<field_1>: <1>, <field_2>: <0>, ...<newField_1>: <expression>....}}])

Если мы хотим отображать только меньшее количество полей по сравнению с общим количеством полей, мы записываем только те поля со значением 1. В противном случае, если мы хотим опустить только меньшее количество столбцов, мы будем упоминать только эти поля и дают значение 0. Обратите внимание, что поле «_id» используется по умолчанию, поэтому, если это поле не нужно, мы должны присвоить ему значение 0.

Давайте посмотрим на пример, в котором этапы $ match и $ project используются вместе.

db.<collection_name>.aggregate([{$match: {rating: 6}}, {$project: {_id: 0, name: 1, type_of_food: 1, rating: 1}}])

Это спроецировало только поля «name», «rating» и «type_of_food», где рейтинг равен 6.

Ограничение количества документов

Когда мы не хотим печатать все документы, а хотим печатать очень мало чисел, мы можем использовать стадию «$ limit», чтобы контролировать количество отображаемых документов. Он аналогичен предложению LIMIT в SQL. Синтаксис следующий.

db.<collecton_name>.aggregate([{$limit: <number>}])

Вот пример.

db.restaurants.aggregate([{$match: {rating: 6}}, {$project: {_id: 0, name: 1, type_of_food: 1, rating: 1}}, {$limit: 3}])

Здесь мы ограничили количество отображаемых документов до трех.

Сортировка документов

Давайте посмотрим, как мы можем отсортировать документы, используя этап «$ sort» в агрегатной функции.

Синтаксис следующий

db.<collection_name>.aggregate([{$sort: {<field_1>: <-1 | 1>, <field_1>: <-1 | 1>.....}}]) «1» соответствует возрастанию, а «-1» - сортировке по убыванию.

Мы увидим пример этого.

db.restaurants.aggregate([{$project: {_id: 0, name: 1, type_of_food: 1, rating: 1}}, {$sort: {type_of_food: -1, rating: 1}}])

В этом примере type_of_food отсортирован по убыванию, а рейтинг - по возрастанию.

Подсчет документов

Этап «$ count» помогает подсчитать количество документов. Синтаксис следующий.

db.<collecton_name>.aggregate([{$count: "<title>"}])

Рассмотрим пример с этапом «$ match».

db.restaurants.aggregate([{$match: {type_of_food: "Caribbean"}}, {$count: "no_of_restaurants_with_caribbean_food"}])

Мы видим, что количество ресторанов с типом еды «Карибская» составляет 46.

Вывод результата

Мы можем сохранить конечный результат конвейера агрегации в другую коллекцию, используя другой этап агрегации, называемый «$ out». Этот этап должен быть последним из всех этапов конвейера агрегации. Синтаксис следующий.

db.<collection_name>.aggregate([{$out: "<outPutCollectionName>"}])

Мы увидим это на практике на примере.

db.restaurants.aggregate([{$project: {_id: 0, name: 1, type_of_food: 1, rating: 1}}, {$sort: {type_of_food: -1, rating: 1}}, {$out: "aggregateResultCollection}])

Это сохранит наши выходные документы в новой коллекции с именем «aggregateResultCollection».

Операторы конвейера агрегирования

Помимо этапов агрегации, в агрегации есть и другие операторы. Здесь мы обсудим некоторые из них, такие как «арифметические», «сравнения» и «логические» операторы. В большинстве случаев эти операторы входят в стадию «$ group».

Арифметические операторы

Они выполняют математические операции с полями. Вот некоторые из них: «$ сумма», «$ сред», «$ макс», «$ мин» и т. Д.

‘$ Sum выполняет операцию суммирования чисел поля. Он аналогичен оператору SUM () в SQL.

«$ Avg» находит среднее всех чисел в поле. Это то же самое, что и оператор AVG () в SQL.

«$ Max» находит максимальное значение поля. MAX () в SQL похож на него.

«$ Min» находит минимальное значение поля. MIN () в SQL похож на него.

Базовый синтаксис этих операторов следующий.

db.<collection_name>.aggregate([{$<operator>: "<expression>"}])

Давайте объединим все вместе и посмотрим.

db.restaurants.aggregate([{$match: {rating: {$ne: "Not yet rated"}}}, {$group: {_id: "$type_of_food", total_rating: {$sum: "$rating"}, avg_rating: {$avg: "$rating"}, max_rating: {$max: "$rating"}, min_rating: {$min: "$rating"}}}])

Первоначально мы отфильтровали некоторые из них, чтобы они не имели рейтинга «Еще не оценены», используя этап «$ group» и оператор сравнения «$ ne».

Мы сгруппировали документы по полю type_of_field. Итак, мы видим, что сумма оценок составляет 12194, средняя оценка - 4,9, максимальная оценка - 6, а минимальная - 1 для каждого типа еды.

Логические операторы

Подобно тому, как SQL имеет операторы AND, OR, NOT для логического анализа, MongoDB также имеет логические операторы, такие как '$ and', '$ or', $ not, '$ nor' и т. Д. Само имя каждого оператора объясняет операции, выполняемые их. Синтаксис следующий.

{$boolean_operator: [<expression1>, <expression2>,….]}

Давайте посмотрим на пример.

db.restaurants.aggregate([{$match: {$and: [{type_of_food: "Caribbean"}, {rating: 4}]}}])

Здесь запрос относится только к типу еды «Карибский» и имеет рейтинг 4. Он вернет результаты всех документов, для которых в поле «type_of_food» указано значение «Caribbean» и рейтинг 4.

Операторы сравнения

Это операторы, которые помогают нам сравнивать числовые значения в полях. Некоторые из них: «$ gt» - больше, «$ lt» - меньше, «$ nte» - не равно, «$ eq» - равно, «$ lte» - меньше или равно и так далее.

Синтаксис операторов сравнения приведен ниже.

{<field>: {$<comparison_operator>: <value>}}

Мы увидим, как это работает, изменив последний пример, выполненный в логическом операторе.

db.restaurants.aggregate([{$match: {$and: [{type_of_food: "Caribbean"}, {rating: {$gte: 4, $lt: 6}}]}}])

Здесь мы только что изменили последний запрос, вернув «type_of_food», «Caribbean» и имеющий рейтинг больше или равен 4 и меньше 6.

Это все для этой статьи. Надеюсь, это поможет всем. Пожалуйста, оставьте здесь свои комментарии и предложения.