Работа с базами данных в JavaScript: PostgreSQL и MongoDB на Node.js
Современная веб-разработка на JavaScript немыслима без эффективного управления данными. Node.js, как серверная платформа, предоставляет мощные инструменты для взаимодействия с различными системами управления базами данных (СУБД). В этой статье мы подробно рассмотрим работу с двумя популярными решениями — реляционной PostgreSQL и документо-ориентированной MongoDB. Вы узнаете, как подключаться к этим базам данных, выполнять CRUD-операции (создание, чтение, обновление, удаление) и делать осознанный выбор между ними.
Материал будет полезен как начинающим разработчикам, которые только осваивают бэкенд на JavaScript, так и опытным специалистам, желающим систематизировать знания. Все примеры кода написаны для среды выполнения Node.js.
Подготовка окружения и установка драйверов
Прежде чем приступить к работе, необходимо установить соответствующие пакеты через npm. Для PostgreSQL используется драйвер pg, а для MongoDB — официальный драйвер mongodb или популярная ODM-библиотека mongoose.
Создайте новый проект и установите зависимости:
mkdir db-example && cd db-example
npm init -y
npm install pg mongoose
Теперь ваше окружение готово к экспериментам. Убедитесь, что на вашей машине запущены соответствующие серверы баз данных (PostgreSQL на порту 5432 и MongoDB на порту 27017).
1. Работа с PostgreSQL через драйвер pg
PostgreSQL — это мощная реляционная СУБД с поддержкой SQL. Для взаимодействия с ней в Node.js используется пакет pg, который предоставляет как пул соединений, так и отдельного клиента.
Рассмотрим базовый пример подключения и выполнения запросов:
const { Pool } = require('pg');
// Настройка пула соединений
const pool = new Pool({
user: 'postgres',
host: 'localhost',
database: 'testdb',
password: 'your_password',
port: 5432,
});
// Асинхронная функция для работы с БД
async function runPostgresExample() {
try {
// Создание таблицы
await pool.query(`
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
age INTEGER
);
`);
// INSERT — добавление данных
const insertResult = await pool.query(
'INSERT INTO users (name, email, age) VALUES ($1, $2, $3) RETURNING *',
['Иван Петров', 'ivan@example.com', 30]
);
console.log('Добавлен пользователь:', insertResult.rows[0]);
// SELECT — чтение данных
const selectResult = await pool.query('SELECT * FROM users');
console.log('Все пользователи:', selectResult.rows);
// UPDATE — обновление данных
await pool.query(
'UPDATE users SET age = $1 WHERE name = $2',
[31, 'Иван Петров']
);
console.log('Возраст обновлен');
// DELETE — удаление данных
await pool.query('DELETE FROM users WHERE name = $1', ['Иван Петров']);
console.log('Пользователь удален');
} catch (err) {
console.error('Ошибка PostgreSQL:', err.message);
} finally {
await pool.end();
}
}
runPostgresExample();
Обратите внимание на использование параметризованных запросов с плейсхолдерами $1, $2 и т.д. Это защищает от SQL-инъекций и является лучшей практикой. Пул соединений рекомендуется для production-среды, так как он эффективно управляет подключениями.
2. Работа с MongoDB через Mongoose
MongoDB — это NoSQL база данных, хранящая данные в формате, похожем на JSON (BSON). Mongoose предоставляет удобную абстракцию с схемами, валидацией и методами для работы с коллекциями.
Пример подключения и CRUD-операций с Mongoose:
const mongoose = require('mongoose');
// Определение схемы пользователя
const userSchema = new mongoose.Schema({
name: { type: String, required: true },
email: { type: String, required: true, unique: true },
age: { type: Number, min: 0 },
createdAt: { type: Date, default: Date.now },
});
// Создание модели на основе схемы
const User = mongoose.model('User', userSchema);
async function runMongoExample() {
try {
// Подключение к MongoDB
await mongoose.connect('mongodb://localhost:27017/testdb');
console.log('Подключено к MongoDB');
// CREATE — создание документа
const newUser = await User.create({
name: 'Мария Соколова',
email: 'maria@example.com',
age: 28,
});
console.log('Создан пользователь:', newUser);
// READ — чтение документов
const users = await User.find();
console.log('Все пользователи:', users);
// UPDATE — обновление документа
const updatedUser = await User.findOneAndUpdate(
{ name: 'Мария Соколова' },
{ age: 29 },
{ new: true } // вернуть обновленный документ
);
console.log('Обновленный пользователь:', updatedUser);
// DELETE — удаление документа
await User.deleteOne({ name: 'Мария Соколова' });
console.log('Пользователь удален');
} catch (err) {
console.error('Ошибка MongoDB:', err.message);
} finally {
await mongoose.disconnect();
}
}
runMongoExample();
Mongoose автоматически преобразует схемы в коллекции (например, модель User создает коллекцию users). Валидация на уровне схемы помогает поддерживать целостность данных без жестких ограничений реляционной модели.
3. Сравнение PostgreSQL и MongoDB: что выбрать?
Выбор между реляционной и документной базой данных зависит от конкретной задачи. Рассмотрим ключевые отличия:
- Структура данных: PostgreSQL требует заранее определенной схемы с таблицами и связями. MongoDB использует гибкие документы, что упрощает работу с неструктурированными или быстро меняющимися данными.
- Сложные запросы: SQL предоставляет мощные возможности JOIN, подзапросов и агрегации. MongoDB имеет свой язык запросов (агрегационный пайплайн), но он менее выразителен для сложных реляционных операций.
- Транзакции и целостность: PostgreSQL поддерживает ACID-транзакции на высоком уровне. MongoDB добавила поддержку многодокументных транзакций, но они менее производительны.
- Масштабирование: MongoDB изначально спроектирована для горизонтального масштабирования (шардинга). PostgreSQL традиционно масштабируется вертикально, хотя существуют решения для репликации.
- Экосистема Node.js: