Проблема: каталог з довільними атрибутами «ламає» реляційну модель
Ми налаштовували MongoDB для інтернет-магазину електроніки: кожна категорія має унікальний набір характеристик (діагональ, кількість ядер, об'єм пам'яті). У PostgreSQL довелося б городити EAV або JSON-поля — складні запити та падіння продуктивності при 500 товарах. MongoDB вирішила це без болю: схема не фіксована, а BSON-документи ідеально лягають на структуру товару. Наш клієнт — магазин з 5000 товарів у 20 категоріях — отримав час відповіді запитів під 10 мс без спеціальної оптимізації. Розповімо, як налаштувати таку базу під ключ.
Проблеми, які вирішуємо
- N+1 запитів при роботі з документами — типова помилка, коли замість вкладених масивів дістають пов'язані документи окремими запитами. Рішення: використовувати
$lookupв агрегації або зберігати вкладені підмасиви. - Повільний запис без реплікації — при падінні єдиного вузла втрачаються дані за хвилини. Replica Set з трьох серверів дає RPO=0 та автоматичне перемикання.
- Індекси не покривають запити — без часткових та складених індексів агрегації за статусом і датою виконуються за секунди замість мілісекунд. З правильно налаштованими індексами продуктивність запитів зростає в 10–100 разів.
Як ми налаштовуємо MongoDB: кейс з Replica Set
Для того ж інтернет-магазину ми розгорнули кластер на трьох серверах (MongoDB 7.0, Ubuntu 22.04). Налаштували Replica Set з двома звичайними вузлами та одним прихованим для бекапів. Connection string застосунку: mongodb://myapp:password@mongo1:27017,mongo2:27017/myapp?replicaSet=rs0&readPreference=secondaryPreferred. У результаті — відмовостійкість та балансування читання на вторинні вузли. Навантаження 10 000 запитів на секунду тримається без затримок.
Встановлення та конфігурація
# Установка MongoDB 7.0
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | gpg --dearmor -o /usr/share/keyrings/mongodb-server-7.0.gpg
echo "deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" > /etc/apt/sources.list.d/mongodb-org-7.0.list
apt update && apt install -y mongodb-org
systemctl enable mongod && systemctl start mongod
# /etc/mongod.conf (основные настройки)
net:
port: 27017
bindIp: 127.0.0.1 # для продакшена замените на внутренний IP
security:
authorization: enabled
storage:
dbPath: /var/lib/mongodb
wiredTiger:
engineConfig:
cacheSizeGB: 2 # 50% RAM
replication:
replSetName: "rs0"
operationProfiling:
slowOpThresholdMs: 100
mode: slowOp
Індекси під типові запити
// Создаём индексы сразу при проектировании схемы
// Уникальный индекс по email
db.users.createIndex({ email: 1 }, { unique: true, background: true })
// Составной для сортировки заказов пользователя
db.orders.createIndex({ userId: 1, createdAt: -1 })
// Частичный — только активные сессии
db.sessions.createIndex(
{ userId: 1, expiresAt: 1 },
{ partialFilterExpression: { revokedAt: { $exists: false } } }
)
// TTL-индекс — автоудаление логов через 30 дней
db.logs.createIndex({ createdAt: 1 }, { expireAfterSeconds: 2592000 })
// Текстовый поиск с русским языком
db.articles.createIndex({ title: "text", body: "text" }, { default_language: "russian" })
// Wildcard для каталога с произвольными атрибутами
db.products.createIndex({ "attributes.$**": 1 })
Агрегація: виручка за категоріями
db.orders.aggregate([
{
$match: {
createdAt: { $gte: ISODate("2024-01-01"), $lt: ISODate("2024-04-01") },
status: "paid"
}
},
{ $unwind: "$items" },
{
$lookup: {
from: "products",
localField: "items.productId",
foreignField: "_id",
as: "product"
}
},
{ $unwind: "$product" },
{
$group: {
_id: "$product.category",
revenue: { $sum: { $multiply: ["$items.price", "$items.quantity"] } },
orders: { $addToSet: "$_id" }
}
},
{
$project: {
category: "$_id",
revenue: { $round: ["$revenue", 2] },
orderCount: { $size: "$orders" }
}
},
{ $sort: { revenue: -1 } }
])
Як обрати топологію MongoDB для вашого проекту?
| Топологія | Навантаження | Об'єм даних | Відмовостійкість | Складність адміністрування |
|---|---|---|---|---|
| Одиночний вузол | до 10 000 оп/с | до 100 ГБ | Немає | Низька |
| Replica Set | до 50 000 оп/с | до 10 ТБ | Автоматичне перемикання | Середня |
| Шардований кластер | >50 000 оп/с | >10 ТБ | Висока (горизонтальне масштабування) | Висока |
Чому Replica Set обов'язковий для продакшену?
Replica Set — мінімальна конфігурація для production. Одиночний вузол не забезпечує відмовостійкість: при збої в роботі сервера дані недоступні до відновлення. Replica Set з трьох вузлів гарантує автоматичне перемикання на вторинний вузол протягом секунд. RPO (точка відновлення) прямує до нуля. Для більшості застосунків це оптимальний баланс надійності та вартості. Зв'яжіться з нами — ми проведемо аудит вашої поточної схеми та запропонуємо оптимальну топологію.
Процес роботи
| Етап | Що робимо | Строк |
|---|---|---|
| Аналітика | Вивчаємо навантаження, схеми, типові запити. Визначаємо необхідність шардування. | 1 день |
| Проектування | Обираємо топологію (Replica Set, шардування), конфігурацію серверів, індекси. | 1 день |
| Реалізація | Розгортаємо сервери, налаштовуємо реплікацію, створюємо індекси, пишемо міграції. | 1–3 дні |
| Тестування | Навантажувальне тестування, перевірка failover, моніторинг. | 1 день |
| Деплой | Перемикання на продакшен, документація, навчання команди. | 1 день |
Що входить в роботу
- Конфігурація сервера та мережі (авторизація, TLS)
- Налаштування Replica Set або шардованого кластера
- Створення індексів під навантаження (часткові, TTL, текстові)
- Оптимізація агрегаційних запитів
- Інтеграція з Mongoose/Node.js (схеми, хуки, віртуальні поля)
- Налаштування моніторингу (MongoDB Atlas, Prometheus + Grafana)
- Резервне копіювання (mongodump + автоматизація)
- Документація та інструкції для команди
Типові помилки при налаштуванні MongoDB
- Відсутність індексів для сортування —
sort()без індексу призводить до сканування колекції (колапс продуктивності). - Ігнорування розміру WiredTiger cache — за замовчуванням 50% RAM, для великих робочих наборів потрібно збільшувати до 70%.
- Глобальний
uniqueіндекс на email — блокує реєстрацію однакових email в різних статусах. Використовуйте часткові індекси. - Запис у Replica Set без
writeConcern: majority— при відкаті первинного вузла дані можуть бути втрачені.
Строки та вартість
Базове налаштування Replica Set з індексами та моніторингом — від 2 до 5 днів. Вартість розраховується індивідуально і залежить від складності схеми та кількості вузлів. Зв'яжіться з нами для оцінки вашого проекту — ми підготуємо комерційну пропозицію за один робочий день. Замовте налаштування MongoDB у сертифікованих спеціалістів з 10-річним досвідом.
Чому варто замовити налаштування у нас?
Ми сертифіковані спеціалісти MongoDB (понад 10 років досвіду в адмініструванні NoSQL). За цей час налаштували понад 50 кластерів для проектів з навантаженням до 100 000 запитів на секунду. Надаємо гарантію на всі роботи — від 3 до 12 місяців залежно від SLA. Отримайте консультацію прямо зараз — ми безкоштовно оцінимо вашу поточну архітектуру.







