Шпаргалка по MongoDB

Изучите MongoDB с практическими лабораторными работами

Изучите управление базами данных NoSQL MongoDB с помощью практических лабораторных работ и сценариев реального мира. LabEx предлагает комплексные курсы по MongoDB, охватывающие основные операции, запросы документов, конвейеры агрегации, стратегии индексирования и продвинутые методы. Освойте документо-ориентированную модель данных MongoDB для создания масштабируемых и гибких приложений баз данных.

Управление Базами Данных и Коллекциями

Показать Базы Данных: show dbs

Отображает все базы данных на сервере MongoDB.

// Показать все базы данных
show dbs
// Показать текущую базу данных
db
// Получить статистику базы данных
db.stats()
// Получить справку по базе данных
db.help()

Использовать Базу Данных: use database_name

Переключиться на определенную базу данных (создается, если не существует).

// Переключиться на базу данных myapp
use myapp
// Создать базу данных, вставив данные
use newdb
db.users.insertOne({name: "John"})
Викторина

Войдите в систему, чтобы ответить на эту викторину и отслеживать свой прогресс обучения

Что произойдет при выполнении команды use newdb в MongoDB?
Она немедленно создает базу данных
Она переключается на базу данных (создает ее при первой вставке данных)
Она удаляет базу данных
Она показывает все коллекции в базе данных

Удалить Базу Данных: db.dropDatabase()

Удаляет текущую базу данных и все ее коллекции.

// Удалить текущую базу данных
db.dropDatabase()
// Подтвердить с именем базы данных
use myapp
db.dropDatabase()

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

Выводит список всех коллекций в текущей базе данных.

// Показать все коллекции
show collections
// Альтернативный метод
db.runCommand("listCollections")

Создать Коллекцию: db.createCollection()

Создает новую коллекцию с необязательной конфигурацией.

// Создать простую коллекцию
db.createCollection('users')
// Создать с опциями
db.createCollection('logs', {
  capped: true,
  size: 1000000,
  max: 1000,
})

Удалить Коллекцию: db.collection.drop()

Удаляет коллекцию и все ее документы.

// Удалить коллекцию users
db.users.drop()
// Проверить, была ли коллекция удалена
show collections

Структура и Информация о Документах

Статистика Коллекции: db.collection.stats()

Отображает подробную статистику о коллекции, включая размер, количество документов и информацию об индексах.

// Статистика коллекции
db.users.stats()
// Посчитать документы
db.users.countDocuments()
// Оценочное количество (быстрее)
db.users.estimatedDocumentCount()
// Проверить индексы коллекции
db.users.getIndexes()

Образцы Документов: db.collection.findOne()

Извлекает образцы документов для понимания структуры и типов данных.

// Получить один документ
db.users.findOne()
// Получить конкретный документ
db.users.findOne({ name: 'John' })
// Получить документ со всеми полями
db.users.findOne({}, { _id: 0 })

Исследовать Данные: db.collection.find().limit()

Просмотр данных коллекции с постраничной навигацией и форматированием.

// Первые 5 документов
db.users.find().limit(5)
// Пропустить и ограничить (пагинация)
db.users.find().skip(10).limit(5)
// Красивое форматирование
db.users.find().pretty()

Вставка Документов (Create)

Вставить Один: db.collection.insertOne()

Добавляет один документ в коллекцию.

// Вставить один документ
db.users.insertOne({
  name: 'John Doe',
  age: 30,
  email: 'john@example.com',
})
// Вставить с пользовательским _id
db.users.insertOne({
  _id: 'custom_id_123',
  name: 'Jane Doe',
  status: 'active',
})
Викторина

Войдите в систему, чтобы ответить на эту викторину и отслеживать свой прогресс обучения

Что возвращает db.users.insertOne()?
Объект подтверждения с _id вставленного документа
Вставленный документ
Ничего
Количество вставленных документов

Вставить Несколько: db.collection.insertMany()

Добавляет несколько документов за одну операцию.

// Вставить несколько документов
db.users.insertMany([
  { name: 'Alice', age: 25 },
  { name: 'Bob', age: 35 },
  { name: 'Charlie', age: 28 },
])
// Вставить с опциями
db.users.insertMany(
  [
    { name: 'Dave', age: 40 },
    { name: 'Eve', age: 22 },
  ],
  { ordered: false },
)

Вставка с Датой: new Date()

Добавление документов с полями временных меток.

// Вставить с текущей датой
db.posts.insertOne({
  title: 'Мой Блогпост',
  content: 'Содержимое поста здесь',
  createdAt: new Date(),
  publishDate: ISODate('2024-01-15'),
})

Вставка Вложенных Документов

Добавление документов с внедренными объектами и массивами.

// Вставить с вложенными объектами
db.users.insertOne({
  name: 'John Doe',
  address: {
    street: '123 Main St',
    city: 'New York',
    zip: '10001',
  },
  hobbies: ['reading', 'swimming', 'coding'],
})

Запросы Документов (Read)

Базовый Поиск: db.collection.find()

Извлечение документов на основе условий запроса.

// Найти все документы
db.users.find()
// Найти с условием
db.users.find({ age: 30 })
// Найти с несколькими условиями (AND)
db.users.find({ age: 30, status: 'active' })
// Найти с условием OR
db.users.find({ $or: [{ age: 25 }, { age: 30 }] })

Проекция: db.collection.find({}, {})

Управление тем, какие поля возвращаются в результатах.

// Включить определенные поля
db.users.find({}, { name: 1, age: 1 })
// Исключить определенные поля
db.users.find({}, { password: 0, _id: 0 })
// Проекция вложенного поля
db.users.find({}, { 'address.city': 1 })

Операторы Запроса: $gt, $lt, $in и т.д.

Использование операторов сравнения и логических операторов для сложных запросов.

// Больше чем, меньше чем
db.users.find({ age: { $gt: 25, $lt: 40 } })
// В массиве
db.users.find({ status: { $in: ['active', 'pending'] } })
// Не равно
db.users.find({ status: { $ne: 'inactive' } })
// Существует
db.users.find({ email: { $exists: true } })
Викторина

Войдите в систему, чтобы ответить на эту викторину и отслеживать свой прогресс обучения

Что означает $gt в запросах MongoDB?
Больше или равно
Больше чем
Группировать по
Получить общее

Поиск по Тексту: $text, $regex

Поиск документов с использованием текста и сопоставления с образцом.

// Поиск по тексту (требуется текстовый индекс)
db.posts.find({ $text: { $search: 'mongodb tutorial' } })
// Поиск по регулярному выражению
db.users.find({ name: { $regex: '^John', $options: 'i' } })
// Поиск без учета регистра
db.users.find({ email: { $regex: '@gmail.com$' } })

Обновление Документов

Обновить Один: db.collection.updateOne()

Изменяет первый документ, соответствующий запросу.

// Обновить одно поле
db.users.updateOne({ name: 'John Doe' }, { $set: { age: 31 } })
// Обновить несколько полей
db.users.updateOne(
  { _id: ObjectId('...') },
  { $set: { age: 31, status: 'updated' } },
)
// Upsert (вставить, если не найдено)
db.users.updateOne(
  { name: 'New User' },
  { $set: { age: 25 } },
  { upsert: true },
)

Обновить Несколько: db.collection.updateMany()

Изменяет все документы, соответствующие запросу.

// Обновить несколько документов
db.users.updateMany({ status: 'inactive' }, { $set: { status: 'archived' } })
// Увеличить значения
db.posts.updateMany({ category: 'tech' }, { $inc: { views: 1 } })

Операторы Обновления: $set, $unset, $push

Используйте различные операторы для изменения полей документа.

// Установить и удалить поля
db.users.updateOne(
  { name: 'John' },
  { $set: { lastLogin: new Date() }, $unset: { temp: '' } },
)
// Добавить в массив
db.users.updateOne({ name: 'John' }, { $push: { hobbies: 'gaming' } })
Викторина

Войдите в систему, чтобы ответить на эту викторину и отслеживать свой прогресс обучения

Что делает $set в операциях обновления MongoDB?
Удаляет поле
Добавляет элемент в массив
Устанавливает значение поля
Удаляет элемент из массива
// Удалить из массива
db.users.updateOne({ name: 'John' }, { $pull: { hobbies: 'reading' } })

Заменить Документ: db.collection.replaceOne()

Заменяет весь документ, кроме поля _id.

// Заменить весь документ
db.users.replaceOne(
  { name: 'John Doe' },
  {
    name: 'John Smith',
    age: 35,
    email: 'johnsmith@example.com',
  },
)

Агрегация Данных

Базовая Агрегация: db.collection.aggregate()

Обработка данных через конвейер стадий агрегации.

// Группировать и считать
db.users.aggregate([{ $group: { _id: '$status', count: { $sum: 1 } } }])
// Фильтровать и группировать
db.orders.aggregate([
  { $match: { status: 'completed' } },
  { $group: { _id: '$customerId', total: { $sum: '$amount' } } },
])

Общие Стадии: $match, $group, $sort

Используйте стадии конвейера для преобразования и анализа данных.

// Сложный конвейер агрегации
db.sales.aggregate([
  { $match: { date: { $gte: ISODate('2024-01-01') } } },
  {
    $group: {
      _id: '$product',
      totalSales: { $sum: '$amount' },
      avgPrice: { $avg: '$price' },
    },
  },
  { $sort: { totalSales: -1 } },
  { $limit: 10 },
])

Операторы Агрегации: $sum, $avg, $max

Вычисление статистических значений и выполнение математических операций.

// Статистические операции
db.products.aggregate([
  {
    $group: {
      _id: '$category',
      maxPrice: { $max: '$price' },
      minPrice: { $min: '$price' },
      avgPrice: { $avg: '$price' },
      count: { $sum: 1 },
    },
  },
])

Стадия Проекции: $project

Преобразование структуры документа и создание вычисляемых полей.

// Проекция и вычисление полей
db.users.aggregate([
  {
    $project: {
      name: 1,
      age: 1,
      isAdult: { $gte: ['$age', 18] },
      fullName: { $concat: ['$firstName', ' ', '$lastName'] },
    },
  },
])

Удаление Документов

Удалить Один: db.collection.deleteOne()

Удаляет первый документ, соответствующий условию запроса.

// Удалить один документ
db.users.deleteOne({ name: 'John Doe' })
// Удалить по ID
db.users.deleteOne({ _id: ObjectId('...') })
// Удалить с условием
db.posts.deleteOne({ status: 'draft', author: 'unknown' })

Удалить Несколько: db.collection.deleteMany()

Удаляет все документы, соответствующие условию запроса.

// Удалить несколько документов
db.users.deleteMany({ status: 'inactive' })
// Удалить все документы (будьте осторожны!)
db.temp_collection.deleteMany({})
// Удалить с условием по дате
db.logs.deleteMany({
  createdAt: { $lt: new Date('2024-01-01') },
})

Найти и Удалить: db.collection.findOneAndDelete()

Находит документ и удаляет его за одну атомарную операцию.

// Найти и удалить
const deletedDoc = db.users.findOneAndDelete({ status: 'pending' })
// Найти и удалить с опциями
db.queue.findOneAndDelete({ processed: false }, { sort: { priority: -1 } })

Индексирование и Производительность

Создать Индекс: db.collection.createIndex()

Создает индексы по полям для ускорения запросов.

// Индекс по одному полю
db.users.createIndex({ email: 1 })
// Составной индекс
db.users.createIndex({ status: 1, createdAt: -1 })
// Текстовый индекс для поиска
db.posts.createIndex({ title: 'text', content: 'text' })
// Уникальный индекс
db.users.createIndex({ email: 1 }, { unique: true })

Управление Индексами: getIndexes(), dropIndex()

Просмотр и управление существующими индексами коллекций.

// Список всех индексов
db.users.getIndexes()
// Удалить конкретный индекс
db.users.dropIndex({ email: 1 })
// Удалить индекс по имени
db.users.dropIndex('email_1')
// Удалить все индексы, кроме _id
db.users.dropIndexes()

Производительность Запросов: explain()

Анализ выполнения запросов и статистики производительности.

// Объяснить выполнение запроса
db.users.find({ age: { $gt: 25 } }).explain('executionStats')
// Проверить, используется ли индекс
db.users.find({ email: 'john@example.com' }).explain()
// Проанализировать производительность агрегации
db.users
  .aggregate([
    { $match: { status: 'active' } },
    { $group: { _id: '$department', count: { $sum: 1 } } },
  ])
  .explain('executionStats')

Советы по Производительности

Рекомендуемые практики для оптимизации запросов и операций MongoDB.

// Использовать проекцию для ограничения объема передаваемых данных
db.users.find({ status: 'active' }, { name: 1, email: 1 })
// Ограничить результаты для лучшей производительности
db.posts.find().sort({ createdAt: -1 }).limit(10)
// Использовать hint для принудительного использования индекса
db.users.find({ age: 25 }).hint({ age: 1 })

Оболочка MongoDB и Подключение

Подключение к MongoDB: mongosh

Запуск оболочки MongoDB и подключение к различным экземплярам.

# Подключение к локальному MongoDB
mongosh
# Подключение к определенному хосту и порту
mongosh "mongodb://localhost:27017"
# Подключение к удаленному серверу
mongosh "mongodb://username:password@host:port/database"
# Подключение с опциями
mongosh --host localhost --port 27017

Помощники Оболочки: help, exit

Получение справочной информации и управление сеансами оболочки.

// Общая справка
help
// Справка по базе данных
db.help()
// Справка по коллекции
db.users.help()
// Выход из оболочки
exit

Переменные Оболочки и Настройки

Настройка поведения оболочки и использование переменных JavaScript.

// Установить переменную
var myQuery = { status: 'active' }
db.users.find(myQuery)
// Настроить параметры отображения
db.users.find().pretty()
// Показать время выполнения
db.users.find({ age: 25 }).explain('executionStats')
// Использование JavaScript в оболочке
var user = db.users.findOne({ name: 'John' })
print('User age: ' + user.age)

Импорт и Экспорт Данных

Импорт Данных: mongoimport

Загрузка данных из файлов JSON, CSV или TSV в MongoDB.

# Импорт JSON файла
mongoimport --db myapp --collection users --file users.json
# Импорт CSV файла
mongoimport --db myapp --collection products \
  --type csv --headerline --file products.csv
# Импорт с upsert
mongoimport --db myapp --collection users \
  --file users.json --mode upsert

Экспорт Данных: mongoexport

Экспорт данных MongoDB в формат JSON или CSV.

# Экспорт в JSON
mongoexport --db myapp --collection users \
  --out users.json
# Экспорт в CSV
mongoexport --db myapp --collection users \
  --type csv --fields name,email,age --out users.csv
# Экспорт с запросом
mongoexport --db myapp --collection users \
  --query '{"status":"active"}' --out active_users.json

Резервное Копирование: mongodump

Создание бинарных резервных копий баз данных MongoDB.

# Резервное копирование всей базы данных
mongodump --db myapp --out /backup/
# Резервное копирование конкретной коллекции
mongodump --db myapp --collection users --out /backup/
# Резервное копирование с сжатием
mongodump --db myapp --gzip --out /backup/

Восстановление: mongorestore

Восстановление данных MongoDB из бинарных резервных копий.

# Восстановление базы данных
mongorestore --db myapp /backup/myapp/
# Восстановление с удалением (drop)
mongorestore --db myapp --drop /backup/myapp/
# Восстановление сжатой резервной копии
mongorestore --gzip --db myapp /backup/myapp/

Установка и Настройка MongoDB

Сервер MongoDB Community

Загрузка и установка MongoDB Community Edition.

# Ubuntu/Debian
sudo apt-get install -y mongodb-org
# Запуск службы MongoDB
sudo systemctl start mongod
# Включение автозапуска
sudo systemctl enable mongod
# Проверка статуса
sudo systemctl status mongod

Установка через Docker

Запуск MongoDB с использованием контейнеров Docker.

# Загрузить образ MongoDB
docker pull mongo
# Запустить контейнер MongoDB
docker run --name mongodb -d \
  -p 27017:27017 \
  -v mongodb_data:/data/db \
  mongo
# Подключение к контейнеру
docker exec -it mongodb mongosh

MongoDB Compass (GUI)

Установка и использование официального графического инструмента MongoDB.

# Загрузить с mongodb.com
# Подключение с использованием строки подключения
mongodb://localhost:27017
# Доступные функции:
# - Визуальный конструктор запросов
# - Анализ схемы
# - Мониторинг производительности
# - Управление индексами

Конфигурация и Безопасность

Аутентификация: Создание Пользователей

Настройка пользователей базы данных с соответствующими ролями и разрешениями.

// Создать администратора
use admin
db.createUser({
  user: "admin",
  pwd: "securepassword",
  roles: [{role: "root", db: "admin"}]
})
// Создать пользователя базы данных
use myapp
db.createUser({
  user: "appuser",
  pwd: "password123",
  roles: [{role: "readWrite", db: "myapp"}]
})

Включение Аутентификации

Настройка MongoDB для требования аутентификации.

# Редактировать /etc/mongod.conf
security:
  authorization: enabled
# Перезапустить MongoDB
sudo systemctl restart mongod
# Подключение с аутентификацией
mongosh -u admin -p --authenticationDatabase admin

Репликация: rs.initiate()

Настройка реплика-сетов для высокой доступности.

// Инициализировать реплика-сет
rs.initiate({
  _id: 'myReplicaSet',
  members: [
    { _id: 0, host: 'mongodb1:27017' },
    { _id: 1, host: 'mongodb2:27017' },
    { _id: 2, host: 'mongodb3:27017' },
  ],
})
// Проверить статус реплика-сета
rs.status()

Опции Конфигурации

Общие настройки конфигурации MongoDB.

# Пример mongod.conf
storage:
  dbPath: /var/lib/mongodb
systemLog:
  destination: file
  path: /var/log/mongodb/mongod.log
net:
  port: 27017
  bindIp: 127.0.0.1
processManagement:
  fork: true

Обработка Ошибок и Отладка

Распространенные Ошибки и Решения

Определение и исправление часто встречающихся проблем с MongoDB.

// Ошибки подключения
// Проверить, запущена ли MongoDB
sudo systemctl status mongod
// Проверить доступность порта
netstat -tuln | grep 27017
// Обработка ошибок дублирования ключа
try {
  db.users.insertOne({email: "existing@example.com"})
} catch (e) {
  if (e.code === 11000) {
    print("Email already exists")
  }
}

Мониторинг: db.currentOp(), db.serverStatus()

Мониторинг операций базы данных и производительности сервера.

// Проверить текущие операции
db.currentOp()
// Убить долго выполняющуюся операцию
db.killOp(operationId)
// Статус сервера
db.serverStatus()
// Статистика подключения
db.runCommand({ connPoolStats: 1 })

Профилирование: db.setProfilingLevel()

Включение профилирования для анализа медленных операций.

// Включить профилирование для медленных операций (>100 мс)
db.setProfilingLevel(1, { slowms: 100 })
// Включить профилирование для всех операций
db.setProfilingLevel(2)
// Просмотреть данные профилировщика
db.system.profile.find().sort({ ts: -1 }).limit(5)
// Отключить профилирование
db.setProfilingLevel(0)

Продвинутые Операции

Транзакции: session.startTransaction()

Использование многодокументных транзакций для согласованности данных.

// Начать сеанс и транзакцию
const session = db.getMongo().startSession()
session.startTransaction()
try {
  const users = session.getDatabase('myapp').users
  const accounts = session.getDatabase('myapp').accounts

  users.insertOne({ name: 'John', balance: 100 })
  accounts.updateOne({ userId: 'john' }, { $inc: { balance: -100 } })

  session.commitTransaction()
} catch (error) {
  session.abortTransaction()
} finally {
  session.endSession()
}

Потоки Изменений: db.collection.watch()

Наблюдение за изменениями в коллекциях в реальном времени.

// Наблюдать за изменениями в коллекции
const changeStream = db.users.watch()
changeStream.on('change', (change) => {
  console.log('Change detected:', change)
})
// Наблюдать с фильтром
const pipeline = [{ $match: { operationType: 'insert' } }]
const changeStream = db.users.watch(pipeline)

Связанные Ссылки