MongoDB & Document Database Vocabulary: 25 Terms Explained (англійською)

Документи, збірки, BSON, конвеєр агрегації, індекси і словник MongoDB для розробників сервера.

Якщо ви працюєте у команді сервера, яка використовує MongoDB, ви, ймовірно, чули такі фрази, як « розділити збірку за ідентифікатором користувача » або « запустити її за допомогою конвеєра агрегації », і кивали головою, спокійно запитуючи себе, що саме було сказано. MongoDB має свій власний словник — частково запозичений з реляційних баз даних, частково з розподілених систем, і частково з власних проектних рішень. У цій статті розглянуто 25 основних термінів, щоб ви могли стежити за технічними обговореннями, читати коментарі до запитів на звантаження і писати точну документацію без перебільшень.


Основні терміни

** Документ ** — фундаментальна одиниця даних у MongoDB. Документ — це набір пар ключ- значення, збережених у гнучкій структурі, схожій на JSON. На відміну від рядка у відносній таблиці, документ може містити вкладені об’ єкти і масиви, і не потрібно, щоб два документи у одній збірці мали однакову форму.

«Ця кінцева точка повертає один документ користувача, тому просто викликайте findOne і передайте його прямо до серіалізатора»

«Схема документа змінилася в останньому спринті — тепер існують дві можливі форми в виробництві, тому аналізатор повинен обробляти обидва»

** Collection ** — групування документів, приблизно аналогічне таблиці у SQL. Збірка типово не використовує фіксовану схему, хоча ви можете додати правила перевірки.

«Ми перенесли журнали аудиту в окрему колекцію, щоб зберегти основну колекцію замовлень»

** BSON ** — Двійковий JSON. MongoDB зберігає документи на диску і передає їх по дроті у форматі BSON, а не у форматі JSON. BSON підтримує додаткові типи даних (такі як дати і двійкові дані), яких стандартний JSON не підтримує. Як розробник ви рідко взаємодієте з BSON безпосередньо, але варто знати цей термін під час читання документації з драйвера.

«Драйвер серіалізує ваш Python dict до BSON перед записом — саме тому поле дати приходить як ISODate, а не як простий рядок.»

ObjectId — типовий тип, який використовує MongoDB для поля _id. Ідентифікатор об’ єкта — це 12- байтне значення, яке кодує штамп часу, ідентифікатор машини і випадковий компонент, що робить зіткнення надзвичайно малоймовірними навіть у розподілених вузлах.

Якщо ви генеруєте ідентифікатори на стороні клієнта, переконайтеся, що ви використовуєте правильний ObjectId, а не випадковий рядок, інакше індекс не буде сортуватися хронологічно

** Вбудований документ проти посилання ** — дві стратегії моделювання відносин. Вбудований документ вкладає пов’ язані дані безпосередньо всередину батьківського документа (це добре для даних, які ви завжди читаєте разом). Посилання зберігає тільки _id пов’ язаного документа в іншій збірці і вимагає окремого запиту або $lookup для його розв’ язання (добре для даних, які великі, часто оновлюється незалежно, або спільно використовуються у багатьох документах).

«Ми обговорювали вбудовування адреси в документ користувача, але оскільки декілька замовлень посилаються на ту ж адресу, ми пішли зі сторінкою посилання замість цього»

«Для зображень продукту ми вбудовуємо URL-адреси — вони маленькі і нам завжди потрібні, коли ми отримуємо продукт»


Запит і агрегація

** Конвейєр агрегування ** — послідовність етапів обробки, які перетворюють набір документів у результат. Кожен етап отримує вивід попереднього етапу, що надає вам змогу фільтрувати, змінювати форму, групувати і об’ єднувати дані за допомогою однієї дії.

“Кінечна точка звітування занадто повільна, тому що вона виконує все групування в коді програми. Давайте перенесем цю логіку в агрегаційний конвеєр»

** $match ** — стадія конвеєра, яка фільтрує документи за допомогою умов запитів, подібно до умови SQL WHERE. Покладання $match на початку конвеєра зменшує кількість документів, що передаються на пізніші стадії.

«Додати $match в верхній частині конвеєра, щоб відфільтрувати за status: 'active' — зараз ми витягуємо всю колекцію в пам’ять»

** $group ** — стадія конвеєра, яка групує документи за вказаним виразом і може обчислювати агрегати, такі як суми, середні значення і кількості.

«$group стадія обчислює загальний дохід за регіоном, а потім $sort впорядковує результати у зменшальному порядку»

** $project ** — етап конвеєра, який змінює форму кожного документа, включаючи або виключаючи поля, перейменовуючи їх або обчислюючи нові значення. Це еквівалентно SQL SELECT.

«Використовуйте $project для видалення внутрішніх аудиторських полів перед тим, як відповідь залишить шар API»

** $lookup ** — стадія конвеєра, яка виконує ліве зовнішнє з’ єднання між поточною збіркою і іншою збіркою у тій самій базі даних, додаючи відповідні документи у вигляді масиву полів.

«Ми замінили шаблон з двома запитами на $lookup, тому вся річ працює на стороні сервера в одну поїздку в обидві сторони»

** Закритий запит ** — запит, у якому всі поля, запитані у фільтрі і проекції, присутні у індексі. MongoDB може задовольняти покритий запит повністю з індексу без читання базових документів, що значно швидше.

«Я перевірив план пояснення і це покритий запит — взагалі немає отримання документів, тільки сканування індексу»

Explain plan — вивід cursor.explain() або db.collection.explain(), який описує, як MongoDB виконав (або планує виконати) запит. У плані пояснень буде показано, чи використовувався індекс, скільки документів було перевірено і на що було витрачено часу.

«Перед тим, як розгорнути цей запит до виробництва, запустіть план пояснення в стаджі та переконайтеся, що він не робить COLLSCAN»


Indexes

** Індекс ** — структура даних, яку MongoDB підтримує разом зі збіркою для прискорення запитів. Без індексу MongoDB має сканувати кожен документ у збірці, щоб знайти відповідності (сканування збірки). Індекси бувають декількох типів.

** Індекс одного поля ** — індекс на одному полі. Найпоширеніший тип, і хороша початкова точка, якщо ви постійно виконуєте запити або впорядковуєте за цим полем.

«Немає індексу на createdAt — додайте індекс з одним полем і запиту на діапазон дат повинно впасти з секунд до мілісекунд»

** Складений індекс ** — індекс з двох або більше полів. Порядок полей має значення: MongoDB може використовувати складний індекс для задовольнення запитів на префікс індексованих полів, але не на суфікс.

«Ми маємо складний індекс на userId і createdAt, тому сортування за датою на користувача швидко, але запит за createdAt сам по собі не використовуватиме його»

** Індекс з декількома ключами ** — індекс поля, значення якого є масивом. MongoDB створює окремий запис індексу для кожного елемента масиву, що дозволяє ефективно виконувати запити на вміст масиву.

Поле tags є масивом, тому MongoDB автоматично створює індекс з декількома ключами — ви можете запитати будь-який тег без сканування документів

** Текстовий індекс ** — спеціалізований індекс, який символізує рядкові поля для підтримки повнотекстового пошуку з оператором $text, включаючи фільтрування за коренем і за закінченням слова.

«Ми додали текстовий індекс на description поле, щоб користувачі могли шукати за ключовими словами без нас, щоб запустити Elasticsearch.»

** Геопросторовий індекс ** — індекс, оптимізований для даних про розташування. Індекс 2dsphere підтримує запити на об’єкти GeoJSON (точки, лінії, багатокутники) для операцій на кшталт «знайти всі місця в межах 5 км»

«Локатор магазинів використовує індекс 2dsphere на полі location — запит $near повертає результати, відсортовані за відстанню автоматично»


Надійність і масштабність

** Застосування запису ** — параметр, який керує кількістю членів набору реплік, які мають підтвердити дію запису, перш ніж MongoDB повідомить про її успіх. Вищий запис збільшує тривалість за рахунок затримки.

«Ми встановили запис проблему до majority на зборі платежів — ми б краще взяти додаткові мілісекунди, ніж ризикувати втратити підтвердження транзакції.»

** Налаштування читання ** — параметр, який керує тим, з якого члена набору реплік програма читає дані. primary (типове значення) читає дані лише з головного елемента; secondary дозволяє читати дані з членів репліки, що може зменшити навантаження на головний елемент, але може повернути дещо застарілі дані.

«Аналіз запитів працює на secondaryPreferred, щоб зберегти навантаження з первинного — кілька секунд застарілості добре для датчиків»

Replica set — група екземплярів MongoDB (зазвичай три або більше), які підтримують один і той же набір даних. Один член є основним (приймає записи); інші є вторинними (реплікують з основного). Якщо основний стає недоступним, додаткові автоматично обирають новий основний.

«У нас був короткий перерив минулої ночі, коли первинний зник, але репліка обрала новий первинний за десять секунд і все відновилося»

** Шардинг ** — метод розповсюдження даних між декількома серверами (шарами), щоб жодна машина не мала цілий набір даних. Шардинг — це стратегія горизонтального масштабування MongoDB.

«Як тільки колекція зростає за кілька сотень гігабайт, нам потрібно буде подумати про шардинг — поточний одинарний шард не зможе витримати»

** Ключ шарду ** — поле (або комбінація полів), яке використовується для визначення того, до якого шарду належить документ. Вибір правильного ключа для фрагментів є критичним: поганий вибір призведе до нерівномірного розподілу даних (гарячих точок).

«Команда провела тиждень, обговорюючи ключ фрагменту — ми вирішили використовувати суміш tenantId і createdAt, щоб отримати рівний розподіл і локальність»

** Чунк ** — у шардованому кластері MongoDB ділить простір ключів на суміжні діапазони, які називаються кубиками, і призначає кожному кубику шард. Балансувальник пересуває шматки між осколками, щоб підтримувати рівномірний розподіл.

«Балансувальник працював у піковій напрузі, тому що занадто багато кубиків мігрували до одного шарду — ми змінили розмір кубиків, щоб зменшити втрати»

** Змінити потік ** — функція, яка надає змогу програмам підписуватися на потоки змін даних (вставлень, оновлень, вилучень) у збірці, базі даних або цілому кластері у реальному часі. Потоки змін побудовані на oplog MongoDB і підтримують відновлюване споживання.

«Ми замінили петлю опитування потоком змін — тепер служба попереджень реагує на нові замовлення менш ніж за секунду замість 30-секундного інтервалу.»


Як використовувати їх у розмові

** Обговорення рішення щодо проектування схеми: **

“Я не впевнений, чи вбудовувати рядкові елементи або посилатися на окрему колекцію orderItems. Вбудовування зберігає його у одному отриманні документа, але великий запит може перевищити обмеження 16 МБ BSON. Що ти думаєш?»

** Перегляд повільного запиту: **

“Я запустив план пояснення на запиті leaderboard і він робить COLLSCAN, тому що немає складного індексу на gameId і score. Якщо ми додамо цей індекс, він повинен стати покритим запитом і час відповіді повинен впасти драматично»

** Планування масштабу: **

«Як тільки ми досягнемо близько 500 ГБ даних користувача, ми повинні почати думати про шардинг. Складна частина - вибрати ключ, який дає нам рівномірне розподіл - якщо ми виберемо userId самі, ми можемо отримати гарячі точки для потенційних користувачів”

Пропонуємо функцію реального часу:

«Замість того, щоб щохвилини перевіряти базу даних на нові вакансії, ми могли б відкрити поток змін на колекції jobs. Інтерфейс користувача буде оновлюватися майже в реальному часі, і ми виключимо багато непотрібного навантаження на читання»


Краткий справочник

TermOne-line definition
DocumentA single BSON record — the basic unit of storage
CollectionA group of documents (like a table, but schema-flexible)
ObjectIdDefault auto-generated _id; encodes timestamp + machine ID
Aggregation pipelineA chain of stages that filter, transform, and join documents
Covered queryA query resolved entirely from an index — no document reads
Explain planQuery execution report; shows index usage and document scan counts
Write concernHow many replica members must confirm a write before it is “done”
Read preferenceWhich replica member to read from (primary vs secondary)
Replica setA cluster of MongoDB nodes sharing the same data for high availability
Change streamReal-time subscription to insert/update/delete events on a collection

Поширені запитання

Про що ця стаття "MongoDB & Document Database Vocabulary: 25 Terms Explained (англійською)"?

Документи, збірки, BSON, конвеєр агрегації, індекси і словник MongoDB для розробників сервера.

Чи безкоштовна ця стаття?

Так. Усі статті на CoderSlingo, включно з цією, доступні безкоштовно без реєстрації.

Скільки часу займає читання "MongoDB & Document Database Vocabulary: 25 Terms Explained (англійською)"?

Приблизно 9 min.