Введение
В этой лабораторной работе вы научитесь трансформировать данные в MongoDB, используя мощный конвейер агрегации (aggregation pipeline). Конвейер агрегации позволяет обрабатывать данные через серию этапов, обеспечивая сложные трансформации, анализ и отчетность. Вы начнете с настройки образца набора данных, а затем перейдете к нескольким ключевым методам трансформации, включая выбор и переименование полей, вычисление новых полей из существующих данных, форматирование вывода и фильтрацию документов по определенным критериям. К концу этой лабораторной работы у вас будет прочная основа для манипулирования данными в MongoDB.
Настройка и базовый выбор полей
На этом первом этапе вы подключитесь к серверу MongoDB, создадите базу данных и коллекцию, а затем вставите некоторые образцы данных. После этого вы выполните первую трансформацию данных, выбрав и переименовав определенные поля из документов.
Сначала откройте терминал и запустите MongoDB Shell (mongosh). Эта интерактивная оболочка является основным способом взаимодействия с вашим экземпляром MongoDB. Вы будете выполнять все операции с базой данных в этой оболочке на протяжении всей лабораторной работы.
mongosh
Как только вы окажетесь внутри MongoDB Shell, ваш приглашение изменится. Теперь создайте и переключитесь на новую базу данных с именем bookstore. Если база данных не существует, эта команда создаст ее.
use bookstore
Далее создайте коллекцию с именем books и вставьте в нее три образца документов с помощью команды insertMany. Коллекция — это группа документов, аналогичная таблице в базе данных SQL.
db.books.insertMany([
{
title: "MongoDB Basics",
author: "Jane Smith",
price: 29.99,
pages: 250,
categories: ["Database", "Programming"]
},
{
title: "Python Deep Dive",
author: "John Doe",
price: 39.99,
pages: 450,
categories: ["Programming", "Python"]
},
{
title: "Data Science Handbook",
author: "Alice Johnson",
price: 49.99,
pages: 600,
categories: ["Data Science", "Programming"]
}
]);
Теперь, когда у вас есть данные, давайте используем конвейер агрегации для их трансформации. Метод aggregate принимает массив этапов (stages), где каждый этап выполняет операцию над данными. Нашим первым этапом будет $project, который изменяет структуру документов.
Выполните следующую команду, чтобы выбрать только поля title и author, переименовав их соответственно в bookTitle и bookAuthor.
db.books.aggregate([
{
$project: {
_id: 0,
bookTitle: "$title",
bookAuthor: "$author"
}
}
]);
Вы должны увидеть следующий вывод:
[
{ "bookTitle": "MongoDB Basics", "bookAuthor": "Jane Smith" },
{ "bookTitle": "Python Deep Dive", "bookAuthor": "John Doe" },
{ "bookTitle": "Data Science Handbook", "bookAuthor": "Alice Johnson" }
]
Разберем этап $project:
_id: 0исключает поле_idпо умолчанию из вывода. По умолчанию оно всегда включается.bookTitle: "$title"создает новое поле с именемbookTitleи присваивает ему значение исходного поляtitle. Префикс$указывает, что вы ссылаетесь на значение поля.bookAuthor: "$author"аналогично переименовывает полеauthorвbookAuthor.
Расчет новых полей
На предыдущем шаге вы выбрали и переименовали существующие поля. Теперь вы научитесь создавать совершенно новые поля, выполняя вычисления над существующими данными. Для этого вы будете использовать этап $addFields, который добавляет новые поля в документы, не удаляя исходные.
Давайте добавим новое поле с именем priceWithTax, которое рассчитывает цену книги с учетом 10% налога.
db.books.aggregate([
{
$addFields: {
priceWithTax: { $multiply: ["$price", 1.1] }
}
}
]);
Вывод будет включать все исходные поля плюс новое поле priceWithTax для каждого документа:
[
{
_id: ObjectId("..."),
title: 'MongoDB Basics',
author: 'Jane Smith',
price: 29.99,
pages: 250,
categories: [ 'Database', 'Programming' ],
priceWithTax: 32.989
},
{
_id: ObjectId("..."),
title: 'Python Deep Dive',
author: 'John Doe',
price: 39.99,
pages: 450,
categories: [ 'Programming', 'Python' ],
priceWithTax: 43.989
},
{
_id: ObjectId("..."),
title: 'Data Science Handbook',
author: 'Alice Johnson',
price: 49.99,
pages: 600,
categories: [ 'Data Science', 'Programming' ],
priceWithTax: 54.989
}
]
В этом конвейере:
$addFields— это этап, используемый для добавления новых полей.priceWithTax— это имя нового поля, которое вы создаете.$multiply— это оператор агрегации, который принимает массив из двух чисел и перемножает их. Здесь он умножает значение поляpriceна1.1.
Форматирование выходных данных
Данные часто становятся более полезными при правильном форматировании. На этом шаге вы научитесь форматировать строковые и числовые данные, используя различные операторы агрегации в рамках этапа $project. Это полезно для подготовки данных к отображению в приложениях или отчетах.
Давайте создадим более читаемый вывод, преобразовав название книги в верхний регистр и отформатировав цену как строку валюты.
db.books.aggregate([
{
$project: {
_id: 0,
titleUpperCase: { $toUpper: "$title" },
formattedPrice: {
$concat: [{ $literal: "$" }, { $toString: "$price" }]
}
}
}
]);
Ожидаемый вывод покажет преобразованные данные:
[
{
"titleUpperCase": "MONGODB BASICS",
"formattedPrice": "$29.99"
},
{
"titleUpperCase": "PYTHON DEEP DIVE",
"formattedPrice": "$39.99"
},
{
"titleUpperCase": "DATA SCIENCE HANDBOOK",
"formattedPrice": "$49.99"
}
]
Рассмотрим операторы, используемые в этом этапе $project:
$toUpper: Этот оператор преобразует строку в верхний регистр. Мы применили его к полюtitle.$concat: Этот оператор объединяет массив строк. Мы использовали его для добавления префикса знака доллара$к цене.$literal: Этот оператор используется для представления литеральных значений, которые в противном случае были бы интерпретированы как выражения. Здесь мы используем{ $literal: "$" }для представления литерального символа доллара.$toString: Поскольку$concatработает только со строками, нам пришлось сначала преобразовать числовое полеpriceв строку с помощью оператора$toString.
Фильтрация результатов с помощью $match
Последняя фундаментальная техника, которую вы изучите, — это фильтрация. Этап $match позволяет выбирать только те документы, которые соответствуют определенным критериям, подобно предложению WHERE в SQL. Это один из наиболее распространенных этапов в конвейере агрегации.
Найдем все книги, стоимость которых превышает 35.
db.books.aggregate([
{
$match: {
price: { $gt: 35 }
}
}
]);
Вывод будет содержать только две книги, соответствующие фильтру:
[
{
_id: ObjectId("..."),
title: 'Python Deep Dive',
author: 'John Doe',
price: 39.99,
pages: 450,
categories: [ 'Programming', 'Python' ]
},
{
_id: ObjectId("..."),
title: 'Data Science Handbook',
author: 'Alice Johnson',
price: 49.99,
pages: 600,
categories: [ 'Data Science', 'Programming' ]
}
]
Этап $match использует стандартный синтаксис запросов MongoDB.
price: { $gt: 35 }определяет условие фильтрации. Он выбирает документы, в которых полеpriceбольше ($gt) 35.
Вы также можете объединять этапы для создания более сложных конвейеров. Например, вы можете сначала отфильтровать документы, а затем спроецировать пользовательский вывод из результатов.
db.books.aggregate([
{
$match: {
price: { $gt: 35 }
}
},
{
$project: {
_id: 0,
title: 1,
price: 1
}
}
]);
Этот конвейер сначала фильтрует дорогие книги с помощью $match, а затем для этих результатов использует $project для отображения только title и price. Синтаксис title: 1 в $project является сокращенным способом включения поля.
Окончательный вывод является одновременно отфильтрованным и спроецированным:
[
{ "title": "Python Deep Dive", "price": 39.99 },
{ "title": "Data Science Handbook", "price": 49.99 }
]
Чтобы выйти из оболочки MongoDB, вы можете ввести exit или нажать Ctrl+D.
Резюме
В этой лабораторной работе вы изучили основные операции конвейера агрегации MongoDB. Вы начали с вставки данных, а затем использовали ряд этапов для их преобразования. Вы практиковались в выборе и переименовании полей с помощью $project, создании новых вычисляемых полей с помощью $addFields, изменении внешнего вида данных с помощью операторов форматирования, таких как $toUpper и $concat, и фильтрации документов с помощью $match. Объединяя эти этапы, вы можете создавать сложные конвейеры обработки данных для анализа и изменения формы ваших данных непосредственно в базе данных, что является мощным и эффективным подходом к манипулированию данными.

