Перейти к основному содержимому

Первые шаги с MongoDB

Разработчику Аналитику Тестировщику
Архитектору Инженеру

Установка системы MongoDB

Процесс установки СУБД требует выполнения действий в зависимости от операционной системы пользователя. Для работы с базой данных необходим серверный компонент (mongod) и клиентские утилиты (mongosh).

Требования к системе

  • Операционная система: Windows, Linux (Debian/Ubuntu/CentOS) или macOS.
  • Права администратора на машине.
  • Доступ к интернету для загрузки установочных пакетов.
  • Минимум 2 ГБ оперативной памяти.

Алгоритм установки

Вариант А: Установка на Windows

  1. Перейдите на официальный сайт проекта MongoDB.
  2. Скачайте последний стабильный дистрибутив для Windows Community Server.
  3. Запустите файл установки.
  4. Следуйте инструкциям мастера установки:
    • Выберите тип установки «Complete» для установки всех компонентов, включая инструменты командной строки и GUI (MongoDB Compass).
    • Укажите путь к директории установки.
    • Настройте параметры запуска службы. Рекомендуется выбрать «Run as a service», чтобы MongoDB запускалась автоматически при загрузке системы.
    • Укажите порт подключения (стандартное значение — 27017).
  5. Завершите установку и откройте приложение MongoDB Compass для визуального управления данными.

Вариант Б: Установка на Linux (на примере Ubuntu/Debian)

Откройте терминал и выполните следующие команды для добавления репозитория и установки пакета:

wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
sudo apt-get update
sudo apt-get install -y mongodb-org

После завершения установки проверьте статус службы:

sudo systemctl status mongod

Для входа в интерактивную оболочку используйте команду:

mongosh

Вариант В: Использование Docker (универсальный способ)

Создание контейнера с базой данных позволяет изолировать среду разработки:

docker run --name mongo \
-d \
-p 27017:27017 \
mongo:latest

Подключение к контейнеру выполняется командой:

docker exec -it mongo mongosh

Создание базы данных

База данных в MongoDB представляет собой логическое хранилище для коллекций документов. В отличие от реляционных систем, база данных создается неявно при первом сохранении документа.

Командный способ

Выполните команду в терминале или через клиент mongosh:

use company_db;

Если база company_db не существует, она будет создана автоматически после первого вставки документа.


Графический способ (MongoDB Compass)

  1. Откройте MongoDB Compass и подключитесь к локальному серверу.
  2. Нажмите кнопку «Create Database».
  3. Введите имя базы company_db.
  4. Укажите имя коллекции (например, employees).
  5. Нажмите кнопку «Create Database».

Важно помнить, что каждая новая база данных имеет собственную схему, которая формируется динамически по мере добавления данных.


Создание коллекции и вставка документов

Коллекция — это аналог таблицы в реляционных базах данных, но она хранит документы в формате BSON (бинарный JSON). Структура документа определяется пользователем.

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

Используйте метод insertOne для добавления одного документа или insertMany для нескольких.

db.employees.insertOne({
_id: ObjectId("65e8f1a2b3c4d5e6f7g8h9i0"),
first_name: "Ivan",
last_name: "Ivanov",
email: "ivanov@example.com",
hire_date: ISODate("2024-01-15"),
salary: 75000.00,
department_id: 1,
skills: ["JavaScript", "Python"],
is_active: true
});

Анализ компонентов определения

  • _id: Уникальный идентификатор документа. Если поле не указано явно, MongoDB генерирует его автоматически в виде объекта ObjectId.
  • first_name, last_name: Текстовые поля произвольной длины.
  • email: Поле для адреса электронной почты.
  • hire_date: Тип данных Date, хранящий временную метку.
  • salary: Числовое поле типа NumberDecimal или Double.
  • department_id: Целочисленное поле для связи с другими данными.
  • skills: Массив строк, позволяющий хранить список значений в одном документе.
  • is_active: Булево поле (true или false).

Вставка нескольких документов

db.employees.insertMany([
{
first_name: "Maria",
last_name: "Petrova",
email: "petrova@example.com",
hire_date: ISODate("2024-02-10"),
salary: 82000.00,
department_id: 2,
skills: ["Java", "Spring"],
is_active: true
},
{
first_name: "Alexey",
last_name: "Sidorov",
email: "sidorov@example.com",
hire_date: ISODate("2024-03-01"),
salary: 65000.00,
department_id: 1,
skills: ["C#", ".NET"],
is_active: false
}
]);

Добавление ограничений и индексов

Ограничения целостности в MongoDB реализуются через валидацию схем (Schema Validation), а индексы ускоряют поиск информации.

Валидация схемы (Constraints)

Валидация определяет правила, которым должны соответствовать документы в коллекции. Это достигается через настройку правил валидации при создании коллекции.

Создайте коллекцию с правилами валидации:

db.createCollection("employees", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["first_name", "last_name", "salary"],
properties: {
first_name: {
bsonType: "string",
description: "Имя сотрудника обязательно"
},
last_name: {
bsonType: "string",
description: "Фамилия сотрудника обязательна"
},
email: {
bsonType: "string",
pattern: "^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$",
description: "Должен быть корректный формат email"
},
salary: {
bsonType: "number",
minimum: 0,
description: "Зарплата должна быть неотрицательным числом"
},
department_id: {
bsonType: "int",
minimum: 1
}
}
}
}
});

При попытке вставить документ, нарушающий эти правила, система вернет ошибку.


Создание индекса

Индекс — это структура данных, которая ускоряет операции выборки. Индексируются часто используемые поля поиска или сортировки.

Создание индекса по фамилии сотрудников:

db.employees.createIndex({ last_name: 1 });

Создание составного индекса для ускорения поиска по отделу и зарплате:

db.employees.createIndex({ department_id: 1, salary: -1 });

Создание уникального индекса для поля email:

db.employees.createIndex({ email: 1 }, { unique: true });

Использование индексов снижает время выполнения запросов, особенно на больших объемах данных.


Выполнение CRUD запросов

CRUD (Create, Read, Update, Delete) — набор операций для управления данными.

Создание записей (Create)

Вставка новых сотрудников уже рассмотрена выше. Также можно использовать метод save, который обновляет документ, если _id существует, или создает новый, если нет.


Чтение данных (Read)

Выборка всех записей:

db.employees.find();

Выборка конкретных полей с фильтрацией:

db.employees.find(
{ salary: { $gt: 70000 } }, // Где зарплата больше 70000
{ first_name: 1, last_name: 1, salary: 1, _id: 0 } // Только эти поля
);

Сортировка результатов:

db.employees.find().sort({ salary: -1 }); // Сортировка по убыванию зарплаты

Поиск по массиву:

db.employees.find({ skills: "Python" }); // Найдутся сотрудники со skill "Python"

Обновление данных (Update)

Изменение зарплаты сотрудника:

db.employees.updateOne(
{ _id: ObjectId("...") }, // Фильтр
{ $set: { salary: 80000.00 } } // Операция обновления
);

Обновление нескольких полей одновременно:

db.employees.updateMany(
{ department_id: 1 },
{ $inc: { salary: 5000 } } // Увеличить зарплату на 5000 всем в отделе 1
);

Добавление элемента в массив:

db.employees.updateOne(
{ first_name: "Ivan" },
{ $push: { skills: "Docker" } }
);

Удаление данных (Delete)

Удаление конкретного сотрудника:

db.employees.deleteOne({ _id: ObjectId("...") });

Удаление всех записей из коллекции:

db.employees.deleteMany({});

Удаление всей коллекции:

db.employees.drop();

Создание представлений (Views)

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

Простое представление

Создание представления со списком сотрудников и их зарплатами:

db.createView("employee_salary_view", "employees", [
{
$lookup: {
from: "departments",
localField: "department_id",
foreignField: "_id",
as: "dept_info"
}
},
{
$unwind: "$dept_info"
},
{
$project: {
first_name: 1,
last_name: 1,
department_name: "$dept_info.name",
salary: 1
}
}
]);

Использование представления:

db.employee_salary_view.find({ salary: { $gt: 75000 } });

Преимущества использования View

  • Упрощение сложных запросов.
  • Сокрытие деталей реализации физических коллекций.
  • Контроль доступа к определенным полям.
  • Стандартизация логики выборки данных.

Создание функций и процедур с агрегатными функциями и Join

В MongoDB нет триггеров в классическом понимании как в SQL, но есть возможности для автоматизации через агенты и функции агрегации. Процедурная логика реализуется через скрипты на JavaScript, выполняемые на стороне сервера.

Функция с агрегатными функциями

Функция рассчитывает среднюю зарплату в отделе.

function get_avg_salary_by_department(deptId) {
return db.employees.aggregate([
{ $match: { department_id: deptId } },
{ $group: { _id: null, avgSalary: { $avg: "$salary" } } }
]).toArray()[0].avgSalary;
}

// Вызов функции
get_avg_salary_by_department(1);

Процедура с использованием пайплайна агрегации

Процедура обновляет статистику отдела при добавлении нового сотрудника. В данном случае мы создадим скрипт, который выполняет группировку и подсчет.

db.employees.aggregate([
{
$lookup: {
from: "departments",
localField: "department_id",
foreignField: "_id",
as: "dept"
}
},
{
$unwind: "$dept"
},
{
$group: {
_id: "$dept.name",
emp_count: { $sum: 1 },
total_salary: { $sum: "$salary" },
avg_salary: { $avg: "$salary" }
}
},
{
$project: {
_id: 0,
department_name: "$_id",
employee_count: "$emp_count",
total_fund: "$total_salary",
average_salary: "$avg_salary"
}
}
]).forEach(function(doc) {
print("Отдел: " + doc.department_name + ", Количество сотрудников: " + doc.employee_count + ", Общий фонд: " + doc.total_fund);
});

Триггерная логика (Validation Rules)

Хотя явных триггеров BEFORE INSERT нет, можно использовать валидацию схемы для проверки условий перед вставкой.

Пример проверки: зарплата не может быть отрицательной. Это правило уже включено в секцию «Валидация схемы» выше через $jsonSchema и условие minimum: 0.

При попытке вставки документа с отрицательной зарплатой система вернет ошибку валидации:

db.employees.insertOne({
first_name: "Test",
last_name: "User",
salary: -5000
});
// Ошибка: Document validation failed for document ...

Для более сложной логики можно использовать триггеры на уровне приложения или использовать MongoDB Change Streams для отслеживания изменений в реальном времени и запуска внешних обработчиков.