1. Що таке MongoDB?
MongoDB — це документно-орієнтована NoSQL база даних, яка зберігає дані у вигляді BSON-документів у колекціях. Вона добре підходить для систем із гнучкою схемою, високим навантаженням на читання/запис і швидкими змінами структури даних.
Ключова ідея: замість жорстких таблиць і JOIN MongoDB працює з документами, які можуть містити вкладені обʼєкти та масиви, що зменшує потребу в нормалізації для багатьох прикладних сценаріїв.
Коротко:
- MongoDB — документна NoSQL база даних.
- Дані зберігаються як BSON-документи в колекціях.
- Орієнтована на гнучку схему та горизонтальне масштабування.
2. До якого типу баз даних належить MongoDB?
MongoDB належить до NoSQL документних СУБД. Це означає, що дані організовуються не у рядки таблиць, а у документи, які логічно групуються в колекції.
За CAP/розподіленими властивостями MongoDB проєктувалась як distributed database з підтримкою replica sets і sharding, тому її часто використовують як операційну базу для high-throughput застосунків.
Коротко:
- Тип: NoSQL, документно-орієнтована база даних.
- Одиниця зберігання: BSON-документ.
- Підтримує distributed-архітектуру (replica sets, sharding).
3. Які основні особливості MongoDB?
Основні особливості MongoDB:
- Документна модель даних: природне зберігання вкладених структур.
- Гнучка схема: поля можна додавати без міграцій таблиць у класичному SQL стилі.
- Потужний Aggregation Framework:
$match,$group,$lookup,$project,$sort,$limitдля аналітики і трансформацій. - Індекси: single field, compound, text, TTL, partial та інші.
- Реплікація і відмовостійкість: replica set з автоматичним failover.
- Горизонтальне масштабування: sharding.
- Транзакції: ACID-транзакції для multi-document операцій.
- Хмарна експлуатація через Atlas: керований кластер, backup, monitoring.
Коротко:
- MongoDB поєднує гнучку модель документів і сильні можливості запитів.
- Має вбудовані індекси, реплікацію, шардінг і транзакції.
- Підходить як для операційних, так і для аналітичних сценаріїв.
4. У чому різниця між MongoDB і реляційними базами даних?
Головна різниця — модель даних:
- У MongoDB дані зберігаються в документах (BSON), часто з вкладеними структурами.
- У реляційних БД дані зберігаються у таблицях, повʼязаних через ключі.
Практичні відмінності:
- Схема:
- MongoDB: гнучка/еволюційна схема.
- SQL БД: зазвичай жорстко визначена схема.
- Звʼязки:
- MongoDB: embedding або referencing.
- SQL БД: JOIN як базовий механізм.
- Масштабування:
- MongoDB: нативний sharding.
- SQL БД: частіше vertical scaling, шардінг складніший.
- Транзакційна модель:
- Обидва підходи підтримують транзакції, але в MongoDB часто проєктують модель так, щоб мінімізувати потребу в multi-document транзакціях.
Коротко:
- MongoDB: документи + гнучка схема.
- SQL: таблиці + фіксована схема + JOIN-орієнтований підхід.
- Вибір залежить від моделі даних і навантаження системи.
5. Що таке документ у MongoDB?
Документ — це базова одиниця зберігання даних у MongoDB. Він має формат
BSON (бінарне представлення JSON-подібної структури) і складається з пар
ключ: значення.
Документ може містити:
- прості поля (
string,number,bool,date); - вкладені обʼєкти;
- масиви;
- службове поле
_id(унікальний ідентифікатор).
Приклад структури документа:
{
_id: ObjectId("65f0c9d4e1b4d8a3f2a1b001"),
name: "Iryna",
skills: ["MongoDB", "Node.js"],
profile: { level: "middle", active: true }
}Коротко:
- Документ — основна сутність у MongoDB.
- Формат документа: BSON.
- Документи підтримують вкладені структури і масиви.
6. Що таке колекція?
Колекція (collection) — це набір документів у межах однієї бази даних MongoDB. Концептуально це аналог таблиці в SQL, але без вимоги однакової жорсткої схеми для кожного запису.
Колекції використовуються для групування документів однієї предметної області,
наприклад: users, orders, products.
Для продуктивності на колекції створюють індекси, а для життєвого циклу даних можуть застосовувати TTL-індекси.
Коротко:
- Колекція — контейнер для документів.
- Аналог таблиці, але з гнучкішою схемою.
- На рівні колекції налаштовуються індекси та правила зберігання.
7. Що таке база даних у MongoDB?
База даних (database) у MongoDB — це логічний контейнер, який містить колекції, індекси, метадані та повʼязані обʼєкти доступу.
Один MongoDB-кластер може мати багато баз даних. Типовий підхід:
- окрема БД на застосунок/сервіс;
- або окрема БД на оточення (
dev,staging,prod).
У production середовищі важливо розділяти доступи на рівні БД і колекцій через ролі та least-privilege policy.
Коротко:
- Database у MongoDB містить набір колекцій.
- Один кластер може обслуговувати багато баз даних.
- Ізоляція по БД часто використовується для середовищ і доступів.
8. Що таке BSON і чим він відрізняється від JSON?
BSON (Binary JSON) — це бінарний формат серіалізації, який MongoDB використовує для зберігання та передачі документів.
Відмінності від JSON:
- Формат:
- JSON — текстовий.
- BSON — бінарний (ефективніший для внутрішньої обробки в БД).
- Типи даних:
- JSON має обмежений набір типів.
- BSON підтримує додаткові типи:
ObjectId,Date,Decimal128,Binary,Timestampтощо.
- Продуктивність:
- BSON оптимізований для швидкого парсингу та доступу до полів у MongoDB.
На практиці клієнтський код працює з JSON-подібними структурами, а MongoDB зберігає їх у BSON.
Коротко:
- BSON — бінарний формат даних MongoDB.
- BSON підтримує більше типів, ніж JSON.
- JSON зручний для API, BSON — для зберігання та обробки в БД.
9. Які типи даних підтримує MongoDB?
MongoDB підтримує базові та спеціалізовані BSON-типи:
StringBooleanInt32,Int64,DoubleDecimal128DateObjectIdArrayDocument(вкладений обʼєкт)NullBinaryTimestampRegular Expression
Практичні правила:
- для фінансових значень використовувати
Decimal128; - для часу подій —
Date(UTC); - для первинних ключів —
_id(ObjectIdабо стабільний власний ключ за потреби).
Коротко:
- MongoDB працює з BSON-типами, не лише з базовими JSON-типами.
- Критичні типи для production:
ObjectId,Date,Decimal128. - Коректний вибір типу напряму впливає на індекси й запити.
10. Що таке поле _id і для чого воно використовується?
_id — це обовʼязкове унікальне поле кожного документа в колекції. Якщо під час
insertOne його не передати, MongoDB автоматично згенерує значення типу
ObjectId.
Призначення _id:
- однозначна ідентифікація документа;
- швидкий доступ через вбудований унікальний індекс;
- стабільне посилання на документ у звʼязках (referencing).
Приклад вставки з автоматичним _id:
db.users.insertOne({ name: "Olena", email: "olena@example.com" })Приклад вставки з власним _id:
db.users.insertOne({ _id: "user_1001", name: "Olena" })Коротко:
_idє в кожному документі й завжди унікальний.- За замовчуванням MongoDB генерує
_idякObjectId. - На
_idавтоматично створюється унікальний індекс.
11. Що таке ObjectId і як він формується?
ObjectId — це 12-байтовий BSON-ідентифікатор, який MongoDB використовує як
стандартне значення _id.
Типово він містить:
- timestamp створення;
- випадкову частину для унікальності;
- інкрементний лічильник.
Через вбудований час створення ObjectId приблизно впорядковується за часом,
що часто зручно для сортування нових записів.
Коротко:
ObjectId— стандартний унікальний ідентифікатор документа.- Генерується автоматично, якщо
_idне передано вручну. - Містить часову компоненту, тому корисний для time-ordered вибірок.
12. Як вставити документ у MongoDB?
Для вставки одного документа використовується insertOne, для кількох —
insertMany.
db.users.insertOne({
email: "anna@example.com",
profile: { name: "Anna", country: "UA" },
createdAt: new Date(),
isActive: true
})db.users.insertMany([
{ email: "oleh@example.com", createdAt: new Date(), isActive: true },
{ email: "ira@example.com", createdAt: new Date(), isActive: false }
], { ordered: false })ordered: false дозволяє продовжувати batch-вставку, навіть якщо окремий
документ не пройшов валідацію або порушив унікальний індекс.
Коротко:
insertOneдля одного документа,insertManyдля batch-вставки.- Якщо
_idне задано, MongoDB створює його автоматично. - Для масових вставок у production часто використовують
ordered: false.
13. Як знайти документи за умовою?
Базовий пошук виконується через find(filter, projection).
db.orders.find(
{ status: "paid", total: { $gte: 1000 } },
{ _id: 1, customerId: 1, total: 1, createdAt: 1 }
)Для одного документа зручно використовувати findOne:
db.orders.findOne({ _id: ObjectId("65f0c9d4e1b4d8a3f2a1b001") })Коротко:
- Основний API для пошуку:
find. - Умови задаються у
filterчерез оператори MongoDB. - Для одиничного запису використовують
findOne.
14. Як оновити документ?
Оновлення виконують через updateOne або updateMany з операторами, наприклад
$set, $inc, $unset.
db.users.updateOne(
{ email: "anna@example.com" },
{
$set: { isActive: true, "profile.country": "PL" },
$inc: { loginCount: 1 }
}
)Upsert (створити, якщо документа немає):
db.users.updateOne(
{ email: "new.user@example.com" },
{ $set: { isActive: true, createdAt: new Date() } },
{ upsert: true }
)Коротко:
updateOne/updateManyзмінюють документи за фільтром.- Зміни задаються через оператори (
$set,$inc, ...). upsert: trueобʼєднує update + insert.
15. Як видалити документ?
Для видалення одного документа використовують deleteOne, для масового —
deleteMany.
db.sessions.deleteOne({ _id: ObjectId("65f0c9d4e1b4d8a3f2a1b0aa") })db.sessions.deleteMany({ expiresAt: { $lt: new Date() } })У production важливо не запускати deleteMany({}) без явної потреби.
Коротко:
deleteOneвидаляє перший відповідний документ.deleteManyвидаляє всі документи, що відповідають фільтру.- Фільтр має бути максимально точним для безпечного видалення.
16. Що таке оператори порівняння в MongoDB?
Оператори порівняння використовуються у фільтрах для умовного пошуку:
$eq, $ne, $gt, $gte, $lt, $lte.
db.products.find({ price: { $gte: 100, $lt: 500 } })db.users.find({ status: { $ne: "blocked" } })Вони комбінуються з логічними операторами ($and, $or) для складних умов.
Коротко:
- Оператори порівняння задають умови відбору документів.
- Найчастіше:
$gt/$gte/$lt/$lte/$ne. - Ефективність залежить від наявності релевантного індексу.
17. Як працюють оператори $in і $nin?
$in перевіряє, чи значення поля входить до набору, $nin — чи не входить.
db.orders.find({ status: { $in: ["new", "paid", "processing"] } })db.orders.find({ status: { $nin: ["canceled", "archived"] } })Для великих списків значень краще обмежувати розмір масиву і перевіряти план
через explain().
Коротко:
$in= входить у список,$nin= не входить.- Зручно для фільтрації по whitelist/blacklist статусів.
- На великих списках потрібен контроль продуктивності через
explain().
18. Як працює оператор $exists?
$exists перевіряє, чи поле присутнє в документі.
db.users.find({ middleName: { $exists: true } })db.users.find({ deletedAt: { $exists: false } })Оператор перевіряє факт наявності поля, а не його значення. Поле може існувати
і мати null.
Коротко:
$exists: trueшукає документи з полем.$exists: falseшукає документи без поля.- Наявність поля і значення
null— різні випадки.
19. Як виконати сортування результатів?
Сортування виконується методом sort():
1— за зростанням;-1— за спаданням.
db.orders
.find({ status: "paid" })
.sort({ createdAt: -1, _id: -1 })
.limit(50)Для стабільного порядку часто додають другий ключ (наприклад _id).
Коротко:
sort({ field: 1|-1 })керує порядком результатів.- Стабільне сортування роблять за кількома полями.
- Найкраща продуктивність при індексі, сумісному з
filter + sort.
20. Як реалізувати пагінацію за допомогою limit і skip?
Базова пагінація:
const page = 3
const pageSize = 20
db.posts
.find({ isPublished: true })
.sort({ createdAt: -1, _id: -1 })
.skip((page - 1) * pageSize)
.limit(pageSize)skip з великими значеннями стає дорогим. Для великих наборів даних краще
cursor-based пагінація (за createdAt + _id).
Коротко:
skip + limit— простий спосіб пагінації.- Працює добре на невеликих/середніх зміщеннях.
- Для deep pagination краще cursor-based підхід.
21. Що таке проєкція (projection)?
Проєкція визначає, які поля повертати з документа у результаті запиту.
db.users.find(
{ isActive: true },
{ _id: 0, email: 1, "profile.name": 1 }
)Це зменшує обсяг даних у відповіді і мережеві витрати.
Коротко:
- Projection контролює склад полів у результаті.
- Допомагає зменшити payload і прискорити читання.
- Часто використовується разом із індексами для covered query.
22. Як вибрати тільки певні поля документа?
Потрібні поля задають у другому аргументі find або через .project() в
aggregate.
db.products.find(
{ category: "laptop" },
{ _id: 1, title: 1, price: 1, stock: 1 }
)Для виключення поля використовують 0:
db.products.find({ category: "laptop" }, { internalNotes: 0 })Коротко:
- Вибір полів керується проєкцією у
find. 1включає поле,0виключає.- Мінімальний набір полів покращує продуктивність запитів.
23. Як працює пошук за регулярними виразами?
Пошук за regex працює через оператор $regex.
db.users.find({ email: { $regex: "@example\\.com$", $options: "i" } })Для префіксного пошуку (наприклад ^ann) можна використовувати індекс краще,
ніж для довільного шаблону .*ann.*.
Для повнотекстового пошуку по словах краще використовувати text index, а не
regex по великих колекціях.
Коротко:
- Regex дозволяє патерн-пошук у рядках.
- Префіксні шаблони ефективніші за довільні.
- Для лінгвістичного пошуку краще
text index.
24. Що таке вкладені документи?
Вкладений документ — це обʼєкт усередині іншого документа.
{
_id: ObjectId("65f0c9d4e1b4d8a3f2a1b101"),
customer: {
name: "Olha",
address: { city: "Kyiv", zip: "01001" }
}
}Доступ до полів виконується через dot notation:
db.orders.find({ "customer.address.city": "Kyiv" })Коротко:
- Вкладені документи моделюють ієрархічні дані.
- Доступ до полів — через dot notation.
- Часто зменшують потребу в JOIN-подібних операціях.
25. Як працювати з масивами в MongoDB?
MongoDB нативно підтримує масиви в документах і дозволяє фільтрувати, оновлювати та агрегувати їх.
db.posts.insertOne({
title: "MongoDB tips",
tags: ["mongodb", "backend", "nosql"],
ratings: [5, 4, 5]
})Запити можуть перевіряти наявність елемента, розмір масиву або умови для
елементів ($elemMatch).
Коротко:
- Масиви є вбудованим типом BSON.
- По масивах доступні фільтри, оновлення і агрегації.
- Для складних умов по елементах використовують
$elemMatch.
26. Як знайти документи за значенням у масиві?
Якщо поле-масив містить значення, документ підходить під фільтр.
db.posts.find({ tags: "mongodb" })Для кількох умов по елементах масиву:
db.products.find({ specs: { $elemMatch: { key: "ram", value: "16GB" } } })Коротко:
field: valueпрацює і для масивів (перевірка containment).$elemMatchпотрібен для складних умов на елемент масиву.- Індекс на масивне поле може суттєво прискорити запит.
27. Як оновити елемент у масиві?
Для оновлення першого відповідного елемента використовують позиційний оператор
$.
db.orders.updateOne(
{ _id: ObjectId("65f0c9d4e1b4d8a3f2a1b201"), "items.sku": "SKU-100" },
{ $set: { "items.$.qty": 3 } }
)Для оновлення кількох елементів застосовують arrayFilters:
db.orders.updateOne(
{ _id: ObjectId("65f0c9d4e1b4d8a3f2a1b201") },
{ $set: { "items.$[it].discount": 10 } },
{ arrayFilters: [{ "it.category": "accessories" }] }
)Коротко:
$оновлює перший знайдений елемент масиву.arrayFiltersдозволяє таргетувати групу елементів.- Фільтр і шлях до масиву мають бути максимально конкретними.
28. Що робить оператор $push?
$push додає новий елемент у масив.
db.posts.updateOne(
{ _id: ObjectId("65f0c9d4e1b4d8a3f2a1b301") },
{ $push: { tags: "performance" } }
)Можна додати кілька елементів і обмежити масив:
db.posts.updateOne(
{ _id: ObjectId("65f0c9d4e1b4d8a3f2a1b301") },
{ $push: { comments: { $each: [{ by: "admin", text: "ok" }], $slice: -50 } } }
)Коротко:
$pushдодає елемент у кінець масиву.- Через
$eachможна додати кілька елементів за раз. $sliceдопомагає обмежувати розмір масиву.
29. Що робить оператор $pull?
$pull видаляє з масиву всі елементи, що відповідають умові.
db.posts.updateOne(
{ _id: ObjectId("65f0c9d4e1b4d8a3f2a1b301") },
{ $pull: { tags: "deprecated" } }
)Приклад для масиву обʼєктів:
db.orders.updateOne(
{ _id: ObjectId("65f0c9d4e1b4d8a3f2a1b201") },
{ $pull: { items: { qty: { $lte: 0 } } } }
)Коротко:
$pullвидаляє елементи масиву за умовою.- Працює і для простих значень, і для обʼєктів.
- Зручно для очистки неактуальних або невалідних елементів.
30. Як працює оператор $addToSet?
$addToSet додає значення в масив тільки якщо такого значення ще немає.
db.users.updateOne(
{ _id: ObjectId("65f0c9d4e1b4d8a3f2a1b401") },
{ $addToSet: { roles: "editor" } }
)Для кількох значень:
db.users.updateOne(
{ _id: ObjectId("65f0c9d4e1b4d8a3f2a1b401") },
{ $addToSet: { roles: { $each: ["reviewer", "editor"] } } }
)Коротко:
$addToSetдодає в масив лише унікальні значення.- Запобігає дублюванню елементів.
- Для batch-додавання використовується
$each.
31. Що таке індекс у MongoDB і навіщо він потрібен?
Індекс — це структура даних, що прискорює пошук і сортування, зменшуючи обсяг документів для сканування.
Без індексу MongoDB часто виконує COLLSCAN (повний перегляд колекції). З
індексом запит переходить до IXSCAN, що суттєво швидше на великих обсягах.
Індекси мають ціну: споживання RAM/диску і додаткові витрати на запис.
Коротко:
- Індекс прискорює читання і сортування.
- Зменшує ризик повного сканування колекції.
- Надмірна кількість індексів погіршує швидкість запису.
32. Які типи індексів підтримує MongoDB?
Найуживаніші типи індексів:
- single field;
- compound;
- multikey (для масивів);
- text;
- TTL;
- hashed;
- wildcard;
- geospatial (
2d,2dsphere).
Вибір індексу залежить від реальних патернів запитів, а не лише від структури документів.
Коротко:
- MongoDB має кілька типів індексів для різних задач.
- Базові production-випадки: single, compound, text, TTL.
- Тип індексу має відповідати конкретному workload.
33. Що таке compound index?
Compound index індексує кілька полів в одному індексі, наприклад:
{ status: 1, createdAt: -1 }.
db.orders.createIndex({ status: 1, createdAt: -1 })Такий індекс ефективний для запитів, які фільтрують по status і сортують по
createdAt, або використовують префікс індексу (тільки status).
Коротко:
- Compound index містить кілька полів.
- Ключовий порядок полів визначає ефективність.
- Має покривати реальні
filter + sortсценарії.
34. Що таке text index?
Text index використовується для пошуку слів і фраз у текстових полях через
оператор $text.
db.articles.createIndex({ title: "text", body: "text" })db.articles.find(
{ $text: { $search: "mongodb replication" } },
{ score: { $meta: "textScore" }, title: 1 }
).sort({ score: { $meta: "textScore" } })Підходить для базового full-text. Для складного relevance/ranking зазвичай використовують Atlas Search.
Коротко:
text indexзабезпечує текстовий пошук через$text.- Дає
textScoreдля ранжування результатів. - Для розширеного пошуку краще Atlas Search.
35. Що таке TTL-індекс?
TTL-індекс автоматично видаляє документи після завершення заданого часу життя.
db.sessions.createIndex(
{ expiresAt: 1 },
{ expireAfterSeconds: 0 }
)У цьому прикладі документ видаляється, коли expiresAt стає меншим за поточний
час.
TTL підходить для сесій, тимчасових токенів, логів із retention policy.
Коротко:
- TTL-індекс автоматизує видалення за часом.
- Працює через поле дати і
expireAfterSeconds. - Зручний для даних із обмеженим життєвим циклом.
36. Як створити індекс?
Індекс створюється через createIndex.
db.users.createIndex({ email: 1 }, { unique: true, name: "ux_users_email" })db.orders.createIndex({ customerId: 1, createdAt: -1 }, { name: "ix_orders_customer_created" })Перед створенням індексу варто перевірити explain() для топ-запитів і
створювати індекси під фактичні шаблони доступу.
Коротко:
createIndexстворює індекс по одному або кількох полях.- Часто додають
uniqueі явнеname. - Індексувати потрібно під реальні запити, а не "про всяк випадок".
37. Як перевірити наявні індекси в колекції?
Для перегляду індексів використовують getIndexes().
db.users.getIndexes()Для статистики використання індексів у довшому періоді можна застосовувати
$indexStats в aggregation.
db.users.aggregate([{ $indexStats: {} }])Коротко:
getIndexes()показує конфігурацію індексів колекції.$indexStatsдопомагає знайти невикористовувані індекси.- Регулярний аудит індексів знижує write overhead.
38. Що таке index cardinality і чому вона важлива?
Index cardinality — це кількість унікальних значень у полі індексу.
- Висока cardinality (наприклад
email) зазвичай дає кращу селективність. - Низька cardinality (наприклад
isActive: true/false) може бути слабкою для самостійного індексу.
Тому індекси по низькокардинальних полях часто комбінують з іншими полями в compound-індекс.
Коротко:
- Cardinality впливає на селективність індексу.
- Висока cardinality зазвичай ефективніша для фільтрації.
- Низьку cardinality часто компенсують compound-індексом.
39. Що таке covered query?
Covered query — це запит, який повністю обслуговується індексом без читання
документів з колекції.
Умова: і поля фільтра, і поля проєкції мають бути в одному індексі.
db.users.createIndex({ email: 1, isActive: 1 })
db.users.find(
{ email: "anna@example.com" },
{ _id: 0, email: 1, isActive: 1 }
)Перевірка робиться через explain() (відсутність стадії читання документа з
колекції).
Коротко:
- Covered query читає дані тільки з індексу.
- Потрібно, щоб
filter + projectionпокривалися одним індексом. - Це зменшує I/O і прискорює читання.
40. Як уникнути collection scan?
Щоб уникати COLLSCAN, потрібні індекси під фактичні запити та регулярний
аналіз планів виконання.
Практичний підхід:
- Додати індекси під
filter + sortнайкритичніших запитів. - Перевіряти
explain("executionStats"). - Зменшувати payload через проєкцію.
- Уникати неіндексованих regex і великих
skip.
db.orders.find({ customerId: 1001, status: "paid" }).sort({ createdAt: -1 }).explain("executionStats")Якщо в плані переважає IXSCAN замість COLLSCAN, стратегія індексації працює
коректно.
Коротко:
- Основний інструмент проти
COLLSCAN— правильні індекси. explain("executionStats")показує реальну ефективність запиту.- Проєкція і коректний патерн пагінації також знижують сканування.
41. Що таке explain() і як його використовувати?
explain() показує план виконання запиту: які індекси використано, скільки
документів/ключів переглянуто, де виникають вузькі місця.
db.orders.find({ customerId: 1001 }).sort({ createdAt: -1 }).explain("executionStats")Основні режими: queryPlanner, executionStats, allPlansExecution.
Коротко:
explain()дає фактичний план виконання запиту.- Для оптимізації найчастіше використовують
executionStats. - Дозволяє виявити
COLLSCAN, неефективні індекси і дорогі сортування.
42. Як аналізувати продуктивність запитів?
Практичний підхід:
- Визначити повільні запити через profiler/Atlas metrics.
- Перевірити
explain("executionStats"). - Порівняти
docsExamined,keysExamined,nReturned. - Додати або переробити індекс під
filter + sort. - Зменшити payload через projection.
Коротко:
- Аналіз починається з пошуку реальних slow queries.
- Ключові метрики:
docsExamined,keysExamined, latency. - Оптимізація: індекси, projection, коректний шаблон запиту.
43. Що таке aggregation framework?
Aggregation Framework — це механізм обробки даних через послідовність стадій pipeline для фільтрації, трансформації, групування та обчислень.
db.orders.aggregate([
{ $match: { status: "paid" } },
{ $group: { _id: "$customerId", total: { $sum: "$total" } } }
])Коротко:
- Aggregation виконує аналітичну і трансформаційну обробку в БД.
- Працює через pipeline зі стадіями.
- Зменшує потребу у постобробці на рівні застосунку.
44. Що таке pipeline в aggregation?
Pipeline — це впорядкований масив стадій, де вихід попередньої стадії є входом наступної.
db.events.aggregate([
{ $match: { type: "login" } },
{ $project: { userId: 1, createdAt: 1 } },
{ $sort: { createdAt: -1 } },
{ $limit: 100 }
])Порядок стадій критично впливає на продуктивність.
Коротко:
- Pipeline = послідовність стадій обробки.
- Дані проходять стадії зліва направо.
- Ранній
$matchі мінімальний$projectзнижують витрати.
45. Що робить стадія $match?
$match фільтрує документи за умовою (аналог find у pipeline).
db.orders.aggregate([
{ $match: { status: "paid", total: { $gte: 1000 } } }
])Ставіть $match максимально рано, щоб зменшити обсяг даних на наступних
стадіях.
Коротко:
$matchвідбирає документи за критеріями.- Найефективніше розміщувати на початку pipeline.
- Може використовувати індекси, якщо стоїть до трансформаційних стадій.
46. Що робить стадія $group?
$group агрегує документи за ключем і обчислює метрики ($sum, $avg, $max,
$min, $count).
db.orders.aggregate([
{ $group: { _id: "$status", totalAmount: { $sum: "$total" }, cnt: { $sum: 1 } } }
])Коротко:
$groupвиконує групування та агрегації.- Ключ групування задається через
_id. - Може бути ресурсомістким без попереднього
$match.
47. Що робить стадія $project?
$project формує структуру вихідного документа: включає/виключає поля,
перейменовує їх і обчислює нові.
db.users.aggregate([
{
$project: {
_id: 0,
email: 1,
fullName: { $concat: ["$profile.firstName", " ", "$profile.lastName"] }
}
}
])Коротко:
$projectкерує фінальним набором полів.- Дозволяє обчислювати нові поля в pipeline.
- Зменшує payload і спрощує формат відповіді.
48. Що робить стадія $sort?
$sort впорядковує документи за одним або кількома полями.
db.orders.aggregate([
{ $match: { status: "paid" } },
{ $sort: { createdAt: -1, _id: -1 } }
])Для великих вибірок без відповідного індексу сортування може бути дорогим.
Коротко:
$sortзадає порядок документів.- Стабільність часто забезпечують додаванням
_id. - Індекс під
match + sortкритичний для продуктивності.
49. Що таке $lookup і як він працює?
$lookup виконує приєднання даних з іншої колекції (аналог JOIN).
db.orders.aggregate([
{
$lookup: {
from: "users",
localField: "customerId",
foreignField: "_id",
as: "customer"
}
}
])Результат додається як масив у поле as.
Коротко:
$lookupоб'єднує дані між колекціями.- Повертає пов'язані записи масивом.
- Потребує індексів на полях зв'язку для ефективності.
50. Які best practices для оптимізації aggregation?
Основні практики:
- Розміщувати
$matchі$projectякомога раніше. - Мінімізувати кількість документів до
$group/$lookup. - Використовувати індекси під стартові стадії.
- Перевіряти
explain()для pipeline. - Уникати зайвих проміжних полів і великих документів.
Коротко:
- Рання фільтрація і проєкція дають найбільший виграш.
- Важкі стадії (
$group,$lookup,$sort) мають отримувати мінімум даних. - Оптимізацію підтверджують тільки через
explain()та метрики.
51. Що таке schema design у MongoDB?
Schema design — це проєктування структури документів, колекцій і зв'язків під конкретні запити, патерни читання/запису і масштабування.
У MongoDB модель орієнтують на read/write workload, а не на жорстку нормалізацію.
Коротко:
- Schema design визначає форму даних і зв'язки.
- Модель будується під реальні запити.
- Ключове рішення: embedding vs referencing.
52. Коли варто використовувати embedding?
Embedding доцільний, коли пов'язані дані:
- часто читаються разом;
- мають відношення 1:1 або 1:few;
- оновлюються в межах одного документа.
Приклад: профіль користувача з налаштуваннями та контактами.
Коротко:
- Embedding зменшує кількість запитів і потребу в
$lookup. - Підходить для компактних тісно пов'язаних даних.
- Не варто використовувати для необмежено зростаючих списків.
53. Коли краще використовувати references?
References кращі, коли:
- зв'язок many-to-many;
- піддокументи великі або ростуть без меж;
- пов'язані частини мають різні цикли оновлення;
- потрібен незалежний доступ до сутностей.
Коротко:
- References зменшують ризик надмірного росту документа.
- Підходять для складних графів зв'язків.
- Часто потребують додаткових запитів або
$lookup.
54. Які переваги та недоліки embedding?
Переваги:
- швидке читання пов'язаних даних одним запитом;
- атомарні оновлення в межах документа;
- простіша модель доступу.
Недоліки:
- ризик великого документа;
- дублювання даних при повторному використанні сутності;
- складніше оновлювати спільні дані в багатьох документах.
Коротко:
- Embedding оптимізує читання і локальні оновлення.
- Основні ризики: ріст документа і дублювання.
- Вибір залежить від патернів доступу, а не від теорії нормалізації.
55. Що таке денормалізація в MongoDB?
Денормалізація — це свідоме дублювання даних у документах для зменшення кількості JOIN-подібних операцій і прискорення читання.
Приклад: збереження customerName в документі замовлення разом з customerId.
Коротко:
- Денормалізація підвищує швидкість читання.
- Компроміс: складніша синхронізація дубльованих полів.
- Працює найкраще, коли читання домінує над записом.
56. Як уникнути надмірного росту документів?
Практики:
- не зберігати безмежні масиви в одному документі;
- архівувати або виносити історію в окрему колекцію;
- використовувати references для "довгих" списків;
- застосовувати TTL для тимчасових даних;
- контролювати розмір документа при моделюванні.
Коротко:
- Найбільший ризик росту: безмежні масиви і логи в документі.
- "Гарячу" і "історичну" частину даних краще розділяти.
- Правильна модель даних попереджає проблеми продуктивності.
57. Що таке schema validation?
Schema validation — це правила на рівні колекції, які перевіряють структуру і
типи документів під час insert/update.
Це знижує ризик невалідних даних у production.
Коротко:
- Validation застосовує контракт даних у самій БД.
- Перевіряє типи, обов'язкові поля, обмеження.
- Працює як додатковий захист до валідації в застосунку.
58. Як працює JSON Schema validation у MongoDB?
MongoDB підтримує валідацію через $jsonSchema у validator колекції.
db.createCollection("users", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["email", "createdAt"],
properties: {
email: { bsonType: "string" },
createdAt: { bsonType: "date" },
isActive: { bsonType: "bool" }
}
}
}
})Коротко:
$jsonSchemaзадає формальний контракт документа.- Перевіряє
bsonType, required-поля і обмеження. - Допомагає тримати однорідну структуру даних.
59. Коли варто використовувати schema validation?
Validation доцільний, коли:
- дані пишуть кілька сервісів;
- схема критична для аналітики/білінгу/звітів;
- потрібен захист від випадкових змін payload;
- потрібен контроль міграцій схеми.
Коротко:
- Використовуйте validation для критичних і спільних даних.
- Це захист від "schema drift" у distributed-системах.
- Гнучка схема MongoDB не скасовує потребу в контракті.
60. Які best practices для моделювання даних у MongoDB?
Базові практики:
- Проєктувати схему від запитів (query-first).
- Обирати embedding/referencing за патернами доступу.
- Планувати індекси разом зі схемою.
- Тримати документи компактними.
- Використовувати однакові типи полів у всій колекції.
Коротко:
- Модель даних має відповідати реальному workload.
- Схема, індекси і запити проєктуються разом.
- Стабільність типів і контроль росту документів критичні.
61. Що таке транзакції в MongoDB?
Транзакції в MongoDB — це ACID-операції, які дозволяють виконати кілька змін як єдине ціле: або commit усіх, або rollback усіх.
Використовуються для multi-document/multi-collection сценаріїв.
Коротко:
- Транзакція гарантує атомарність набору операцій.
- Потрібна, коли одна операція охоплює кілька документів.
- Для одиночного документа атомарність є й без транзакції.
62. У яких випадках варто використовувати транзакції?
Транзакції потрібні, коли важлива узгодженість між кількома документами:
- переказ коштів між рахунками;
- резерв товару + створення замовлення;
- синхронні зміни в кількох колекціях.
Якщо задачу можна вирішити атомарним оновленням одного документа, транзакція зазвичай не потрібна.
Коротко:
- Використовуйте транзакції тільки для справді multi-document консистентності.
- Не застосовуйте їх "за замовчуванням".
- Менша кількість транзакцій зазвичай = краща продуктивність.
63. Чим транзакції MongoDB відрізняються від транзакцій у SQL?
Концептуально ACID схожий, але відмінність у моделі даних:
- у MongoDB багато сценаріїв закриваються атомарністю одного документа;
- у SQL частіше потрібні multi-row/табличні транзакції через нормалізацію.
У MongoDB транзакції зазвичай дорожчі за звичайні одно-документні операції.
Коротко:
- ACID-механіка схожа, модель використання відрізняється.
- MongoDB частіше проєктують так, щоб мінімізувати транзакції.
- Транзакції застосовують там, де без них не гарантується консистентність.
64. Як транзакції впливають на продуктивність?
Транзакції додають накладні витрати: триваліші блокування ресурсів, більше пам'яті/журналювання, вищу latency.
Щоб мінімізувати вплив:
- робити транзакції короткими;
- зменшувати кількість документів у транзакції;
- уникати довгих бізнес-операцій усередині транзакції.
Коротко:
- Транзакції підвищують вартість операцій.
- Короткі та вузькі транзакції працюють стабільніше.
- Необхідно балансувати консистентність і throughput.
65. Що таке write concern?
writeConcern визначає, скільки вузлів повинні підтвердити запис.
Приклади:
w: 1— підтвердження primary;w: "majority"— підтвердження більшості реплік.
j: true додає підтвердження запису в journal.
Коротко:
writeConcernкерує надійністю запису.majorityпідвищує стійкість до збоїв.- Вища надійність зазвичай підвищує latency запису.
66. Що таке read concern?
readConcern визначає рівень узгодженості даних, які повертає читання.
Поширені рівні: local, majority, snapshot (для транзакцій).
Вибір залежить від компромісу між свіжістю, консистентністю і затримкою.
Коротко:
readConcernзадає гарантії читання.majorityдає більш стійке до rollback читання.- Вища консистентність може коштувати дорожче по latency.
67. Що таке read preference?
readPreference визначає, з яких вузлів replica set читати дані:
primary, primaryPreferred, secondary, secondaryPreferred, nearest.
Для критично консистентних read-after-write сценаріїв зазвичай використовують
primary.
Коротко:
readPreferenceрозподіляє навантаження читання.secondaryможе зменшити тиск на primary.- Режим читання впливає на свіжість даних.
68. Що таке replica set?
Replica set — це група MongoDB-вузлів з реплікацією даних для high availability.
Типово складається з primary, secondary і опційно arbiter.
Коротко:
- Replica set забезпечує відмовостійкість і реплікацію.
- Один вузол приймає записи (primary), інші реплікують (secondary).
- Основа production-розгортань MongoDB.
69. Як працює primary і secondary?
Primary приймає write-операції та веде oplog. Secondary асинхронно
реплікують зміни з oplog primary.
У разі відмови primary один з secondary обирається новим primary.
Коротко:
- Записи йдуть на primary.
- Secondary копіюють зміни через oplog.
- Архітектура дозволяє безперервність сервісу при збоях вузла.
70. Що таке автоматичне перемикання (failover)?
Failover — це автоматичне обрання нового primary у replica set, якщо поточний primary недоступний.
Клієнтський драйвер, за коректного connection string, перепідключається до нового primary автоматично.
Коротко:
- Failover зменшує downtime при відмові primary.
- Новий primary обирається election-механізмом.
- Драйвери повинні бути налаштовані на роботу з replica set.
71. Що таке sharding?
Sharding — це горизонтальне масштабування, коли дані розподіляються між кількома шардами за shard key.
Це дозволяє масштабувати storage і throughput за межі одного вузла.
Коротко:
- Sharding ділить дані між вузлами.
- Дає горизонтальне масштабування читання/запису.
- Критично залежить від правильного shard key.
72. Коли потрібно використовувати sharding?
Sharding потрібен, коли:
- дані не вміщаються на одному сервері;
- write/read throughput перевищує можливості одного replica set;
- потрібне масштабування з передбачуваним ростом.
Перед sharding треба оптимізувати схему, індекси і запити.
Коротко:
- Використовуйте sharding при реальному ліміті single-cluster ресурсів.
- Це інструмент масштабування, а не первинної оптимізації.
- Спочатку індекси й модель даних, потім sharding.
73. Що таке shard key?
Shard key — поле або набір полів, за якими MongoDB розподіляє документи по шардах.
Від shard key залежить рівномірність даних і розподіл навантаження.
Коротко:
- Shard key керує маршрутизацією даних між шардами.
- Невдалий ключ створює hot shard і дисбаланс.
- Вибір ключа — ключове архітектурне рішення в sharded-системі.
74. Які критерії вибору shard key?
Критерії:
- Висока cardinality.
- Рівномірний розподіл значень.
- Відповідність частим запитам.
- Відсутність монотонного росту, що створює гарячі партиції.
Часто використовують compound shard key для балансу між routing і розподілом.
Коротко:
- Ключ має рівномірно розподіляти дані і запити.
- Висока cardinality зазвичай обов'язкова.
- Ключ повинен відповідати реальному query pattern.
75. Як працює балансування даних між шардами?
Balancer переміщує chunks між шардами, щоб вирівнювати обсяг даних і навантаження.
Процес працює фоново і спирається на метадані кластеру.
Коротко:
- Балансер перерозподіляє chunks між шардами.
- Мета: уникати перекосу даних і hot shard.
- Якість балансування прямо залежить від shard key.
76. Що таке WiredTiger cache?
WiredTiger cache — це частина RAM, яку storage engine використовує для гарячих даних, індексів і внутрішніх структур.
Ефективний cache зменшує кількість дискових читань і стабілізує latency.
Коротко:
- WiredTiger cache тримає найчастіше використовувані дані в пам'яті.
- Впливає на I/O і загальну швидкодію.
- Нестача cache проявляється ростом дискової активності й latency.
77. Як MongoDB використовує оперативну пам’ять?
RAM використовується для:
- cache даних та індексів (WiredTiger);
- робочих наборів запитів;
- буферів сортування/агрегацій;
- службових процесів реплікації і журналювання.
Головна ціль — щоб "гарячий" working set максимально вміщався в пам'ять.
Коротко:
- MongoDB активно покладається на RAM для швидкого доступу.
- Найважливіше — тримати working set у пам'яті.
- Дефіцит RAM різко збільшує disk I/O.
78. Як моніторити продуктивність MongoDB?
Моніторинг включає:
- latency read/write;
- throughput операцій;
- cache hit ratio;
- utilization CPU/RAM/disk;
- replication lag;
- повільні запити.
У self-hosted використовують mongostat, mongotop, profiler, системні метрики;
в Atlas — вбудований Performance Advisor і dashboards.
Коротко:
- Моніторинг має покривати БД і інфраструктуру одночасно.
- Ключові сигнали: latency, lag, cache, slow queries.
- Регулярний моніторинг запобігає деградації продуктивності.
79. Що таке profiler у MongoDB?
Profiler записує інформацію про операції в system.profile для аналізу
повільних або всіх запитів (залежно від рівня).
db.setProfilingLevel(1, { slowms: 100 })Рівні: 0 (off), 1 (slow ops), 2 (all ops).
Коротко:
- Profiler дає деталі виконання запитів на рівні БД.
- Найчастіше використовують рівень
1з порогомslowms. - Допомагає точно локалізувати дорогі операції.
80. Які найпоширеніші проблеми продуктивності в MongoDB?
Типові проблеми:
- відсутні або невдалі індекси;
- надлишкові індекси (write overhead);
- великі документи і безмежні масиви;
- неефективні
$lookup/$group; - deep pagination через великий
skip; - нерівномірний shard key у sharded-кластері.
Коротко:
- Найчастіша причина повільної роботи — індекси і модель даних.
- Проблеми з schema design швидко масштабуються разом з трафіком.
- Регулярний аудит запитів і індексів обов'язковий.
81. Що таке MongoDB Atlas?
MongoDB Atlas — керований хмарний сервіс MongoDB з автоматизацією розгортання, оновлень, backup, моніторингу та безпеки.
Підтримує replica set, sharding, Atlas Search і Vector Search.
Коротко:
- Atlas = managed MongoDB у хмарі.
- Знімає операційне навантаження з команди.
- Дає готові production-інструменти з коробки.
82. У чому різниця між self-hosted MongoDB і MongoDB Atlas?
Self-hosted:
- повний контроль над інфраструктурою;
- команда сама керує backup, upgrades, HA, security.
Atlas:
- більшість операцій автоматизована;
- швидший запуск і масштабування;
- інтегровані monitoring, alerting, advisor-інструменти.
Коротко:
- Self-hosted дає максимальний контроль, але більший операційний тягар.
- Atlas спрощує експлуатацію і прискорює delivery.
- Вибір залежить від вимог комплаєнсу, бюджету і ресурсів команди.
83. Що таке Atlas Serverless?
Atlas Serverless — модель, де обчислювальні ресурси автоматично підлаштовуються під навантаження без ручного керування кластерами.
Підходить для нерівномірного трафіку і швидкого старту.
Коротко:
- Serverless прибирає керування інстансами вручну.
- Ресурси масштабуються за фактичним навантаженням.
- Зручно для bursty workload і MVP/продуктів із змінним трафіком.
84. Як працює autoscaling у MongoDB Atlas?
Autoscaling автоматично змінює ресурси кластера (compute/storage) за порогами навантаження, заданими конфігурацією Atlas.
Це допомагає уникати ручного масштабування під піковий трафік.
Коротко:
- Autoscaling реагує на ріст навантаження і даних.
- Знижує ризик деградації при піках.
- Потрібно контролювати ліміти і вартість.
85. Які можливості моніторингу та алертів доступні в Atlas?
Atlas надає:
- dashboards по latency/ops/resources;
- Performance Advisor;
- Database Profiler integration;
- алерти по CPU, RAM, disk, replication lag, connections, query latency;
- інтеграції з зовнішніми каналами нотифікацій.
Коротко:
- Atlas має вбудований production-моніторинг.
- Алерти можна налаштувати на ключові SLO-метрики.
- Performance Advisor допомагає з індексацією запитів.
86. Що таке Atlas Search?
Atlas Search — це керований пошуковий рушій у MongoDB Atlas на базі Lucene для повнотекстового, fuzzy, autocomplete і гібридного пошуку.
Використовується через стадію $search в aggregation.
Коротко:
- Atlas Search дає розширений пошук понад базовий
text index. - Підтримує relevance, autocomplete, fuzzy та аналітику пошуку.
- Інтегрується нативно в MongoDB pipeline.
87. Чим Atlas Search відрізняється від text index?
text index:
- базовий full-text через
$text; - обмежені можливості ранжування й аналізаторів.
Atlas Search:
- гнучкі analyzers, scoring, fuzzy, synonyms, autocomplete;
- кращий контроль relevance і пошукової логіки.
Коротко:
text indexпростіший і базовий.- Atlas Search значно потужніший для production-пошуку.
- Для складного search UX зазвичай обирають Atlas Search.
88. Як реалізувати повнотекстовий пошук у MongoDB Atlas?
Кроки:
- Створити Search Index в Atlas.
- Використати
$searchу pipeline. - Додати фільтри, сортування і ліміти.
db.articles.aggregate([
{
$search: {
index: "default",
text: { query: "mongodb sharding", path: ["title", "content"] }
}
},
{ $limit: 20 }
])Коротко:
- Потрібен окремий Search Index у Atlas.
- Запит виконується через
$search. - Далі застосовуються звичайні стадії aggregation.
89. Що таке autocomplete index в Atlas Search?
Autocomplete index оптимізований для пошуку підрядків/префіксів у live search (підказки під час введення).
Використовується з оператором autocomplete у $search.
Коротко:
- Дає швидкі підказки "на льоту".
- Працює краще за regex для пошукового UX.
- Налаштовується окремим типом поля в Search Index.
90. У яких випадках варто використовувати Atlas Search?
Atlas Search доцільний, коли потрібні:
- релевантний повнотекстовий пошук;
- fuzzy/synonym/autocomplete;
- складний search UX з ранжуванням.
Для простих сценаріїв "знайти слово" може вистачати text index.
Коротко:
- Atlas Search потрібен для складного пошуку й релевантності.
- Підходить для каталогів, контенту, knowledge base, e-commerce.
- Для базових задач можливий lighter варіант через
text index.
91. Що таке Vector Search у MongoDB?
Vector Search — це пошук за близькістю embedding-векторів для семантичного порівняння контенту.
Замість точного збігу слів система шукає "схожий за змістом" текст.
Коротко:
- Vector Search працює по embedding-представленнях.
- Дозволяє semantic similarity пошук.
- Базовий компонент AI/RAG-сценаріїв.
92. Як зберігати embeddings у MongoDB?
Embedding зазвичай зберігають як масив чисел у полі документа разом з метаданими джерела.
db.docs.insertOne({
title: "MongoDB sharding guide",
content: "...",
embedding: [0.013, -0.224, 0.991],
source: "kb",
createdAt: new Date()
})Далі налаштовується vector index для similarity search.
Коротко:
- Embedding зберігається в масиві числових значень.
- Поруч тримають metadata для фільтрації.
- Для пошуку потрібен vector index.
93. Як працює semantic search?
Semantic search порівнює вектор запиту з векторами документів і повертає найближчі за змістом результати.
Потік:
- Перетворити запит у embedding.
- Виконати vector similarity пошук.
- За потреби додати фільтри/гібридний ранкінг.
Коротко:
- Пошук ґрунтується на змісті, а не лише на словах.
- Ключовий елемент — якісні embeddings.
- Часто комбінується з класичним keyword search.
94. Як MongoDB використовується в AI або RAG-системах?
MongoDB у RAG використовується як операційне + пошукове сховище:
- зберігання документів і метаданих;
- зберігання embeddings;
- vector/keyword пошук для retrieval;
- журналювання діалогів і контексту.
Типовий flow: ingest -> chunking -> embedding -> index -> retrieval -> generation.
Коротко:
- MongoDB закриває зберігання контенту і retrieval-шар.
- Підтримує hybrid search для RAG-пайплайнів.
- Дає єдину платформу для operational + AI-data workload.
95. Що таке connection string і як підключитися до MongoDB?
Connection string — URI з параметрами доступу до MongoDB: хости, БД, автентифікація, TLS, replica set, read/write policy.
mongodb+srv://app_user:strongPass@cluster0.example.mongodb.net/appdb?retryWrites=true&w=majorityУ production credentials зберігають у secret manager або environment variables.
Коротко:
- Connection string описує, куди і як підключатися.
- Для Atlas зазвичай використовують
mongodb+srv://. - Облікові дані не зберігають у коді.
96. Як працює connection pooling?
Connection pooling — це повторне використання набору відкритих з'єднань замість створення нового з'єднання на кожен запит.
Практика:
- ініціалізувати один клієнт на процес;
- налаштовувати
maxPoolSize,minPoolSize,maxIdleTimeMSпід workload; - уникати частого
connect/disconnect.
Коротко:
- Пул з'єднань знижує latency і навантаження на БД.
- Клієнт зазвичай має бути singleton у сервісі.
- Розмір пулу налаштовують під реальний concurrency.
97. Які best practices безпеки в MongoDB?
Ключові практики:
- Увімкнути authentication і TLS.
- Використовувати RBAC з least privilege.
- Ізолювати мережевий доступ (allowlist/private networking).
- Регулярно ротуати секрети.
- Увімкнути audit/logging для критичних середовищ.
- Своєчасно оновлювати версії MongoDB/драйверів.
Коротко:
- Безпека = auth + шифрування + мінімальні права.
- Мережеве обмеження доступу критичне для production.
- Оновлення і аудит знижують ризик компрометації.
98. Як працює role-based access control (RBAC)?
RBAC надає права через ролі, прив'язані до користувачів.
Роль містить дозволи на дії (find, insert, update, remove, admin-операції)
для конкретних БД/колекцій.
db.grantRolesToUser("app_user", [{ role: "readWrite", db: "appdb" }])Коротко:
- RBAC керує доступом через ролі, а не через точкові винятки.
- Права видають за принципом least privilege.
- Ролі мають бути розділені за функціями сервісів.
99. Як виконувати резервне копіювання та відновлення даних?
Варіанти backup:
- логічні дампи (
mongodump/mongorestore); - snapshot backup (Atlas/self-hosted storage snapshots);
- point-in-time recovery (де доступно).
Практика:
- автоматизувати backup schedule;
- тестувати restore регулярно;
- контролювати RPO/RTO вимоги.
Коротко:
- Backup без регулярного тесту restore не вважається надійним.
- Стратегія визначається RPO/RTO та обсягом даних.
- Для production потрібна автоматизація і перевірка відновлення.
100. Які архітектурні best practices для масштабування MongoDB у production?
Практичний набір:
- Проєктувати схему і індекси під реальні запити.
- Впроваджувати replica set як базовий стандарт HA.
- Додавати sharding лише при досягненні ресурсних меж.
- Використовувати observability: метрики, профайлер, алерти.
- Контролювати growth даних: TTL, архівація, lifecycle policy.
- Регулярно переглядати query plans і індекси.
Коротко:
- Масштабування починається з моделі даних і індексів.
- Відмовостійкість, моніторинг і backup мають бути вбудовані з першого дня.
- Шардінг застосовують як керований етап еволюції системи.