Введение
В этой лабораторной работе вы научитесь выполнять базовые операции агрегации в MongoDB. Эти операции позволяют обрабатывать записи данных и возвращать вычисленные результаты. Вы научитесь рассчитывать суммы, находить минимальные и максимальные значения, подсчитывать документы и вычислять средние значения. В лабораторной работе используется пример коллекции bookstore для демонстрации возможностей фреймворка агрегации MongoDB для извлечения значимых сведений из ваших данных.
Подключение и заполнение данных
Прежде чем мы сможем обобщить данные, нам нужно подключиться к серверу MongoDB и вставить некоторые примеры данных. На этом шаге вы запустите MongoDB Shell, создадите базу данных и заполните коллекцию информацией о книгах.
Сначала откройте терминал и запустите MongoDB Shell (mongosh):
mongosh
Теперь вы находитесь в MongoDB Shell, которая позволяет вам взаимодействовать с вашими базами данных. Давайте переключимся на новую базу данных под названием bookstore. Если база данных не существует, MongoDB создаст ее для вас, когда вы впервые сохраните данные.
use bookstore
Далее мы вставим несколько документов книг в коллекцию с именем books, используя метод insertMany(). Каждый документ представляет собой JSON-объект, содержащий title (название), price (цена) и quantity (количество).
db.books.insertMany([
{ title: "Python Basics", price: 29.99, quantity: 50 },
{ title: "MongoDB Essentials", price: 39.99, quantity: 30 },
{ title: "Data Science Guide", price: 45.5, quantity: 25 },
{ title: "Web Development", price: 34.75, quantity: 40 }
]);
Вы должны увидеть вывод, подтверждающий успешную вставку документов.
Чтобы убедиться, что данные были добавлены, вы можете использовать метод find() для получения и отображения всех документов в коллекции books.
db.books.find();
Вывод будет содержать список четырех документов, которые вы только что вставили, каждому из которых MongoDB присвоила уникальный _id.
[
{
_id: ObjectId("..."),
title: 'Python Basics',
price: 29.99,
quantity: 50
},
{
_id: ObjectId("..."),
title: 'MongoDB Essentials',
price: 39.99,
quantity: 30
},
{
_id: ObjectId("..."),
title: 'Data Science Guide',
price: 45.5,
quantity: 25
},
{
_id: ObjectId("..."),
title: 'Web Development',
price: 34.75,
quantity: 40
}
]
Теперь, когда наша коллекция настроена, мы можем приступить к выполнению операций агрегации.
Расчет итогов
На этом шаге вы научитесь рассчитывать общие значения с помощью фреймворка агрегации MongoDB. Конвейеры агрегации обрабатывают данные через серию этапов. Мы будем использовать этап $group для группировки документов и оператор $sum для выполнения расчетов.
Начнем с расчета общего количества книг на складе по всем наименованиям. Мы сгруппируем все документы в одну группу и просуммируем их поля quantity.
db.books.aggregate([
{
$group: {
_id: null,
totalQuantity: { $sum: "$quantity" }
}
}
]);
Вот разбивка команды:
db.books.aggregate([...]): Инициирует конвейер агрегации для коллекцииbooks.$group: Этап, который группирует входные документы._id: null: Указывает, что все документы в коллекции должны быть сгруппированы вместе в один выходной документ.totalQuantity: { $sum: "$quantity" }: Определяет новое полеtotalQuantity. Оператор$sumвычисляет сумму поляquantity(с префиксом$) для всех документов в группе.
Ожидаемый вывод:
[{ "_id": null, "totalQuantity": 145 }]
Далее рассчитаем общую стоимость инвентаря всех книг вместе взятых. Для этого потребуется умножить price на quantity для каждой книги, а затем просуммировать результаты.
db.books.aggregate([
{
$group: {
_id: null,
totalBookValue: { $sum: { $multiply: ["$price", "$quantity"] } }
}
}
]);
В этом конвейере:
$multiply: ["$price", "$quantity"]: Это выражение умножает поляpriceиquantityдля каждого документа.$sum: Этот оператор затем суммирует результаты умножения для всех документов.
Ожидаемый вывод:
[{ "_id": null, "totalBookValue": 5226.7 }]
Поиск минимальных и максимальных значений
Поиск минимальных и максимальных значений в наборе данных является распространенной аналитической задачей. На этом шаге вы будете использовать операторы агрегации $min и $max для поиска самых дешевых и самых дорогих книг в нашей коллекции.
Как и $sum, операторы $min и $max используются в рамках этапа $group. Давайте создадим единый конвейер агрегации для поиска как самой низкой, так и самой высокой цены книги.
db.books.aggregate([
{
$group: {
_id: null,
lowestPrice: { $min: "$price" },
highestPrice: { $max: "$price" }
}
}
]);
Этот конвейер работает следующим образом:
_id: null: Группирует все документы вместе.lowestPrice: { $min: "$price" }: Создает полеlowestPriceи устанавливает его значение равным минимальному значению поляpriceво всех документах.highestPrice: { $max: "$price" }: Создает полеhighestPriceи устанавливает его значение равным максимальному значению поляprice.
Ожидаемый вывод покажет минимальные и максимальные цены, найденные в коллекции:
[{ "_id": null, "lowestPrice": 29.99, "highestPrice": 45.5 }]
Вы можете применить ту же логику к другим числовым полям. Например, чтобы найти минимальное и максимальное количество на складе, вы бы использовали $min и $max для поля quantity.
db.books.aggregate([
{
$group: {
_id: null,
lowestQuantity: { $min: "$quantity" },
highestQuantity: { $max: "$quantity" }
}
}
]);
Ожидаемый вывод для этого запроса:
[{ "_id": null, "lowestQuantity": 25, "highestQuantity": 50 }]
Подсчет документов и расчет средних значений
На этом шаге вы изучите еще два полезных метода обобщения: подсчет документов и расчет средних значений. Мы рассмотрим как простой метод подсчета, так и фреймворк агрегации для более сложных сценариев.
Сначала подсчитаем общее количество документов в нашей коллекции books. Метод countDocuments() является самым простым способом сделать это.
db.books.countDocuments();
Вывод будет представлять собой одно число:
4
Вы также можете передать фильтр запроса в countDocuments(), чтобы подсчитать только те документы, которые соответствуют определенным критериям. Например, давайте подсчитаем, сколько книг имеют цену выше 35 долларов.
db.books.countDocuments({ price: { $gt: 35 } });
Оператор $gt означает "больше чем" (greater than). Вывод будет следующим:
2
Далее рассчитаем среднюю цену книги с помощью фреймворка агрегации. Оператор $avg, используемый в этапе $group, вычисляет среднее значение числового поля.
db.books.aggregate([
{
$group: {
_id: null,
averagePrice: { $avg: "$price" }
}
}
]);
Этот конвейер группирует все документы и вычисляет среднее значение поля price. Вывод будет следующим:
[{ "_id": null, "averagePrice": 37.56 }]
Фреймворк агрегации предоставляет мощный и гибкий способ выполнения таких вычислений, как подсчет и усреднение, особенно при комбинировании с другими этапами для обработки более сложной логики.
Создание сводного отчета
На заключительном этапе вы объедините несколько этапов агрегации для создания более сложного сводного отчета. Это демонстрирует, как можно последовательно применять операторы для получения наглядных представлений ваших данных. Мы создадим отчет, который классифицирует книги по ценовым категориям "Бюджетный" (Budget) и "Премиум" (Premium) и рассчитывает сводную статистику для каждой из них.
Наша цель — сгруппировать книги по их цене, затем рассчитать количество наименований, общее количество, общую стоимость и среднюю цену для каждой группы.
Выполните следующий конвейер агрегации:
db.books.aggregate([
{
$group: {
_id: {
$cond: {
if: { $lt: ["$price", 35] },
then: "Budget",
else: "Premium"
}
},
totalBooks: { $sum: 1 },
totalQuantity: { $sum: "$quantity" },
totalValue: { $sum: { $multiply: ["$price", "$quantity"] } },
avgPrice: { $avg: "$price" }
}
}
]);
Давайте разберем этот мощный конвейер:
$group: Этот этап является ядром нашего отчета._id: { $cond: ... }: Вместоnullмы используем оператор$cond(условный) для динамического определения идентификатора группы. Еслиpriceкниги меньше ($lt) 35, ей присваивается группа "Budget"; в противном случае — "Premium".totalBooks: { $sum: 1 }: Это распространенный метод подсчета документов в группе. Для каждого документа он добавляет1к итогу.totalQuantity,totalValue,avgPrice: Это те же аккумуляторы, которые вы изучали на предыдущих шагах, но теперь они работают в рамках каждой ценовой категории.
Вывод предоставляет чистую сводку для каждой категории. Обратите внимание, что порядок документов может варьироваться.
[
{
"_id": "Premium",
"totalBooks": 2,
"totalQuantity": 55,
"totalValue": 2212.75,
"avgPrice": 42.745
},
{
"_id": "Budget",
"totalBooks": 2,
"totalQuantity": 90,
"totalValue": 2984.5,
"avgPrice": 32.37
}
]
Этот пример показывает, как фреймворк агрегации может использоваться для преобразования необработанных данных в структурированные, осмысленные отчеты непосредственно в базе данных.
Резюме
В этой лабораторной работе вы изучили основы агрегации данных в MongoDB. Вы начали с подключения к базе данных и заполнения коллекции примерами данных. Затем вы использовали фреймворк агрегации для выполнения нескольких распространенных задач обобщения. Вы узнали, как использовать этап $group с такими операторами, как $sum для расчета итогов, $min и $max для поиска граничных значений, и $avg для вычисления средних значений. Вы также попрактиковались в использовании countDocuments() для простых подсчетов и увидели, как создавать многогранный сводный отчет, комбинируя несколько операторов и этапов. Эти навыки необходимы для анализа данных и получения ценной информации из ваших коллекций MongoDB.

