Документы, коллекции и базы

Три уровня хранения в MongoDB и как они соотносятся с привычными таблицами и строками.

Коллекция — это группа документов, аналог таблицы; документ — отдельная запись, аналог строки; база — контейнер коллекций.

Документ — атом хранения

Документ — это набор пар «поле — значение». Внешне он выглядит как объект JSON. Значением может быть число, строка, булево, дата, массив, вложенный объект или специальный тип вроде ObjectId.

{
  "title": "Властелин колец",
  "year": 1954,
  "inStock": true,
  "tags": ["fantasy", "classic"],
  "author": { "name": "Толкин", "country": "UK" }
}

BSON: как это хранится на самом деле

В файлах MongoDB хранит документы не как текстовый JSON, а в бинарном формате BSON (Binary JSON). BSON компактнее, быстрее обходится машиной и, что важно, поддерживает типы, которых нет в чистом JSON: Date, ObjectId, Decimal128, бинарные данные. Вы пишете запросы в привычном JSON-синтаксисе, а движок работает с BSON — об этом переводе можно не думать.

Коллекция — группа документов

Документы одного смысла лежат в коллекции: пользователи в users, заказы в orders. В отличие от таблицы, коллекция не требует, чтобы все документы имели одинаковые поля — у одного пользователя может быть телефон, у другого нет. Коллекция создаётся автоматически при первой вставке, объявлять её заранее не нужно.

База данных — контейнер коллекций

На верхнем уровне находится база данных. Один сервер MongoDB может держать много баз, в каждой — свои коллекции. Переключиться на базу в консоли просто:

use shop

Если базы shop ещё нет, она появится в момент первой записи. Та же логика, что с коллекциями: ничего не создаётся «вхолостую».

Соответствие реляционным понятиям

Эта таблица — главная шпаргалка для перехода с SQL:

Реляционная БДMongoDB
База данных (database)База данных (database)
Таблица (table)Коллекция (collection)
Строка (row)Документ (document)
Столбец (column)Поле (field)
Первичный ключ (PRIMARY KEY)Поле _id
JOINВложение документа или $lookup

Смена мышления

Главный сдвиг: в SQL вы сначала проектируете схему «вширь» (какие таблицы и связи), а данные потом раскладываете. В MongoDB вы думаете «как эта сущность будет читаться и записываться» и складываете её в документ так, чтобы типичный запрос требовал минимум обращений. Структура следует за запросами, а не наоборот.

Итог

  • Документ ≈ строка, коллекция ≈ таблица, база ≈ база. Поле ≈ столбец, _id ≈ первичный ключ.
  • Снаружи документ — это JSON, внутри MongoDB хранит его как бинарный BSON с расширенным набором типов.
  • Коллекции и базы создаются автоматически при первой записи и не навязывают единую схему.
Проверьте себя
1. Какому реляционному понятию соответствует коллекция в MongoDB?
AСтроке
BСтолбцу
CТаблице
DВнешнему ключу
2. Что такое BSON?
AТекстовый формат, идентичный JSON
BБинарный формат хранения документов с расширенными типами (Date, ObjectId и др.)
CЯзык запросов MongoDB
DИмя стандартной коллекции
3. Нужно ли создавать коллекцию заранее, перед первой вставкой документа?
AДа, иначе вставка завершится ошибкой
BНет, коллекция создаётся автоматически при первой записи
CДа, но только командой CREATE TABLE
DНет, но сначала нужно объявить все поля
Поддержать проект