MongoDB

📜 Общее описание и историческая справка

MongoDB — документоориентированная NoSQL СУБД с открытым исходным кодом. Разработка началась в 2007 году компанией 10gen (ныне MongoDB Inc.) как платформа для облачных приложений. Первый стабильный релиз вышел в 2009 году. MongoDB хранит данные в формате BSON (бинарный JSON), что позволяет гибко менять схему данных. Ключевые особенности: горизонтальное масштабирование через шардинг, репликация с автоматическим failover, агрегационный фреймворк, мощная система запросов. В 2018 году MongoDB сменила лицензию на Server Side Public License (SSPL) в ответ на использование её кода облачными провайдерами без вклада в развитие. Сегодня MongoDB является одной из самых популярных NoSQL СУБД.

Источники: История MongoDB, книга "MongoDB: The Definitive Guide" (Kristina Chodorow).

🏭 Область применения и рекомендации

MongoDB идеально подходит для:

  • Систем с гибкой схемой данных (быстрая разработка).
  • Больших данных и высоких нагрузок на запись.
  • Приложений, где требуется горизонтальная масштабируемость.
  • Хранения иерархических данных, каталогов товаров, журналов событий.

Рекомендации: избегайте MongoDB, если для приложения критичны сложные транзакции с несколькими коллекциями (хотя транзакции поддерживаются с версии 4.0) или требуется строгая согласованность на уровне SQL.

🛠️ Как создать/инициировать базу

# Запустить сервер (в терминале)
mongod --dbpath /data/db

# Подключиться через клиент mongo
mongo

# Создать базу (переключиться на неё)
use mydb

# Создать коллекцию и вставить документ
db.users.insertOne({ name: "Alice", age: 30, email: "alice@example.com" })

В драйверах (Node.js, Python и др.) база создаётся при первом обращении к ней.

💡 Основные нюансы языка (MongoDB Query Language)

MongoDB использует JSON-подобный язык запросов:

  • Запросы строятся как документы с операторами: $eq, $gt, $in, $regex и т.д.
  • Агрегационный конвейер (aggregation pipeline) — мощный инструмент для обработки данных (стадии: $match, $group, $lookup и др.).
  • Поддержка индексов (одиночные, составные, текстовые, геопространственные).
  • Транзакции, аналогичные реляционным, доступны для нескольких документов с версии 4.0.
  • Для обновления используются операторы $set, $inc, $push и др.

🔑 Наборы ключевых команд (mongo shell)

-- Показать все базы
show dbs

-- Переключиться на базу
use mydb

-- Показать коллекции
show collections

-- Найти все документы
db.users.find().pretty()

-- Обновить документ
db.users.updateOne({ name: "Alice" }, { $set: { age: 31 } })

-- Удалить документ
db.users.deleteOne({ name: "Bob" })

-- Создать индекс
db.users.createIndex({ email: 1 })

📊 Построение запросов (сложные примеры)

Агрегация с группировкой и вычислением среднего:

db.sales.aggregate([
    { $match: { date: { $gte: ISODate("2023-01-01") } } },
    { $group: { _id: "$product", avgAmount: { $avg: "$amount" }, total: { $sum: 1 } } },
    { $sort: { avgAmount: -1 } }
])

Lookup (аналог JOIN) между коллекциями orders и customers:

db.orders.aggregate([
    {
        $lookup: {
            from: "customers",
            localField: "customerId",
            foreignField: "_id",
            as: "customerInfo"
        }
    },
    { $unwind: "$customerInfo" }
])

Текстовый поиск с сортировкой по релевантности:

db.articles.createIndex({ content: "text" });
db.articles.find({ $text: { $search: "database performance" } },
                 { score: { $meta: "textScore" } })
           .sort({ score: { $meta: "textScore" } });

📚 Ссылки на документы, статьи, книги