Home » Как использовать shell MongoDB
Как использовать shell MongoDB

Как использовать shell MongoDB

Работа с MongoDB через shell — это как владение мечом джедая для любого сервер-админа. Сегодня разберем, как превратить эту штуку из загадочного черного ящика в мощный инструмент для управления NoSQL базами данных. Если вы уже задумались о том, чтобы поднять MongoDB на своем сервере, то эта статья поможет вам не только установить и настроить, но и эффективно использовать mongo shell для решения повседневных задач.

Mongo shell — это интерактивная JavaScript-консоль, которая идет в комплекте с MongoDB. Она позволяет взаимодействовать с базой данных напрямую, выполнять запросы, администрировать кластеры и отлаживать приложения. Если вы привыкли к mysql или psql, то mongo shell станет вашим аналогом для мира документо-ориентированных баз данных.

Как это работает под капотом

MongoDB shell работает как JavaScript-интерпретатор с предустановленными объектами и методами для работы с базой данных. Когда вы запускаете mongo shell, он подключается к mongod процессу (серверу MongoDB) и предоставляет интерфейс для выполнения команд.

Основные компоненты взаимодействия:

  • mongod — сервер базы данных
  • mongo — клиент (shell)
  • JavaScript Engine — выполняет команды
  • BSON — формат данных (Binary JSON)

Важный момент: начиная с MongoDB 4.4, появился новый mongo shell под названием mongosh, который постепенно заменяет старый mongo shell. Рассмотрим работу с обеими версиями.

Установка и первое подключение

Сначала нужно установить MongoDB на сервер. Для примера возьмем Ubuntu 20.04. Если у вас нет подходящего сервера, можно заказать VPS здесь или выделенный сервер для более серьезных нагрузок.

# Добавляем официальный репозиторий MongoDB
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list

# Обновляем пакеты и устанавливаем MongoDB
sudo apt-get update
sudo apt-get install -y mongodb-org

# Запускаем сервис
sudo systemctl start mongod
sudo systemctl enable mongod

# Проверяем статус
sudo systemctl status mongod

Теперь подключаемся к shell:

# Стандартное подключение к локальному серверу
mongo

# Или новый shell (если установлен)
mongosh

# Подключение к удаленному серверу
mongo --host your-server.com --port 27017

# Подключение с аутентификацией
mongo --host localhost --port 27017 -u username -p password --authenticationDatabase admin

Основные команды и операции

После подключения вы увидите приглашение командной строки. Время разобраться с основными командами:

// Показать все базы данных
show dbs

// Создать/переключиться на базу данных
use myapp

// Показать текущую базу данных
db

// Показать коллекции в текущей базе
show collections

// Создать коллекцию
db.createCollection("users")

// Вставить документ
db.users.insertOne({
    name: "John Doe",
    email: "john@example.com",
    age: 30,
    created: new Date()
})

// Вставить несколько документов
db.users.insertMany([
    {name: "Alice", email: "alice@example.com", age: 25},
    {name: "Bob", email: "bob@example.com", age: 35}
])

Продвинутые запросы и фильтрация

Самое интересное начинается с поиска и фильтрации данных:

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

// Найти с условием
db.users.find({age: {$gt: 25}})

// Найти один документ
db.users.findOne({name: "John Doe"})

// Сложные запросы
db.users.find({
    $and: [
        {age: {$gte: 25}},
        {age: {$lte: 35}}
    ]
})

// Регулярные выражения
db.users.find({email: /gmail\.com$/})

// Проекция полей
db.users.find({}, {name: 1, email: 1, _id: 0})

// Сортировка и лимит
db.users.find().sort({age: -1}).limit(5)

Обновление и удаление данных

// Обновить один документ
db.users.updateOne(
    {name: "John Doe"},
    {$set: {age: 31, lastLogin: new Date()}}
)

// Обновить несколько документов
db.users.updateMany(
    {age: {$lt: 30}},
    {$set: {category: "young"}}
)

// Upsert - создать, если не существует
db.users.updateOne(
    {email: "new@example.com"},
    {$set: {name: "New User", age: 28}},
    {upsert: true}
)

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

// Удалить несколько документов
db.users.deleteMany({age: {$lt: 18}})

Индексы и производительность

Без индексов ваши запросы будут работать медленно. Разберем, как их создавать и использовать:

// Создать индекс по одному полю
db.users.createIndex({email: 1})

// Составной индекс
db.users.createIndex({age: 1, name: 1})

// Уникальный индекс
db.users.createIndex({email: 1}, {unique: true})

// Частичный индекс
db.users.createIndex(
    {email: 1},
    {partialFilterExpression: {age: {$gt: 18}}}
)

// Показать все индексы
db.users.getIndexes()

// Удалить индекс
db.users.dropIndex({email: 1})

// Анализ производительности запроса
db.users.find({email: "john@example.com"}).explain("executionStats")

Агрегация — мощь MongoDB

Aggregation framework — это то, что делает MongoDB действительно мощным инструментом для анализа данных:

// Простая агрегация
db.users.aggregate([
    {$match: {age: {$gte: 25}}},
    {$group: {_id: null, avgAge: {$avg: "$age"}}}
])

// Группировка по возрасту
db.users.aggregate([
    {$group: {
        _id: "$age",
        count: {$sum: 1},
        names: {$push: "$name"}
    }},
    {$sort: {count: -1}}
])

// Более сложный пример с unwind
db.orders.aggregate([
    {$unwind: "$items"},
    {$group: {
        _id: "$items.product",
        totalSold: {$sum: "$items.quantity"},
        avgPrice: {$avg: "$items.price"}
    }},
    {$sort: {totalSold: -1}},
    {$limit: 10}
])

Администрирование и мониторинг

Для сервер-администраторов критически важно уметь мониторить состояние MongoDB:

// Статистика сервера
db.serverStatus()

// Статистика базы данных
db.stats()

// Статистика коллекции
db.users.stats()

// Текущие операции
db.currentOp()

// Убить длительную операцию
db.killOp(operationId)

// Информация о репликации
db.printReplicationInfo()

// Профилирование медленных запросов
db.setProfilingLevel(1, {slowms: 100})
db.system.profile.find().sort({ts: -1}).limit(5)

Сравнение с альтернативами

Характеристика MongoDB Shell MySQL CLI PostgreSQL psql
Язык запросов JavaScript-подобный SQL SQL
Автокомплит Да (в mongosh) Ограниченный Отличный
Скриптинг JavaScript SQL + процедуры SQL + PL/pgSQL
Интерактивность Высокая Средняя Высокая

Скриптинг и автоматизация

Mongo shell отлично подходит для автоматизации через скрипты:

// Создаем файл backup_script.js
// Скрипт для создания резервной копии
var collections = db.getCollectionNames();
var backupData = {};

collections.forEach(function(collection) {
    if (collection.indexOf('system.') !== 0) {
        backupData[collection] = db[collection].find().toArray();
    }
});

printjson(backupData);

// Запуск скрипта
mongo myapp backup_script.js > backup.json

// Скрипт для инициализации данных
// init_data.js
use myapp;

db.users.insertMany([
    {name: "Admin", role: "admin", created: new Date()},
    {name: "User", role: "user", created: new Date()}
]);

db.settings.insertOne({
    appName: "MyApp",
    version: "1.0.0",
    features: ["auth", "api", "dashboard"]
});

print("Database initialized successfully");

Полезные функции и хитрости

Несколько трюков, которые сделают вашу жизнь проще:

// Красивый вывод JSON
db.users.find().pretty()

// Подсчет документов
db.users.count()
db.users.countDocuments({age: {$gt: 25}})

// Получение случайных документов
db.users.aggregate([{$sample: {size: 3}}])

// Экспорт данных в CSV
mongoexport --db myapp --collection users --type csv --fields name,email,age --out users.csv

// Импорт данных
mongoimport --db myapp --collection users --type json --file users.json

// Создание дампа базы данных
mongodump --db myapp --out /backup/

// Восстановление из дампа
mongorestore --db myapp /backup/myapp/

Безопасность и лучшие практики

Настройка аутентификации и безопасности:

// Создание пользователя-администратора
use admin
db.createUser({
    user: "admin",
    pwd: "strongpassword",
    roles: ["userAdminAnyDatabase", "dbAdminAnyDatabase"]
})

// Создание пользователя для конкретной базы
use myapp
db.createUser({
    user: "appuser",
    pwd: "apppassword",
    roles: ["readWrite"]
})

// Включение аутентификации в /etc/mongod.conf
security:
  authorization: enabled

// Подключение с аутентификацией
mongo --authenticationDatabase admin -u admin -p

Мониторинг и отладка

Для production-окружения критически важно настроить мониторинг:

// Включение медленных запросов в лог
db.setProfilingLevel(1, {slowms: 50})

// Анализ индексов
db.users.find({email: "test@example.com"}).explain("executionStats")

// Проверка размера коллекций
db.runCommand({collStats: "users"})

// Мониторинг соединений
db.serverStatus().connections

// Статистика использования индексов
db.users.aggregate([{$indexStats: {}}])

Интеграция с другими инструментами

MongoDB отлично работает в связке с другими инструментами:

  • MongoDB Compass — GUI для визуальной работы с данными
  • Robo 3T — популярный клиент с shell-интерфейсом
  • Studio 3T — коммерческий клиент с расширенными возможностями
  • Grafana + Prometheus — для мониторинга метрик

Полезные ссылки для изучения:

Заключение и рекомендации

MongoDB shell — это мощный инструмент, который должен быть в арсенале каждого сервер-администратора. Он позволяет не только выполнять базовые операции CRUD, но и проводить сложную аналитику, администрировать кластеры и автоматизировать рутинные задачи.

Основные рекомендации:

  • Начинайте с простых команд и постепенно изучайте aggregation framework
  • Всегда создавайте индексы для часто используемых полей
  • Используйте explain() для анализа производительности запросов
  • Настройте мониторинг и профилирование для production-окружения
  • Регулярно делайте резервные копии с помощью mongodump
  • Не забывайте про безопасность — настройте аутентификацию и авторизацию

MongoDB shell особенно полезен для DevOps-инженеров, которые работают с микросервисами, аналитическими системами и приложениями, требующими гибкой схемы данных. Если вы планируете серьезно заниматься MongoDB, обязательно изучите новый mongosh — он предоставляет улучшенный пользовательский опыт и дополнительные возможности.


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

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

Leave a reply

Your email address will not be published. Required fields are marked