- Home »

Как использовать 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
- Документация MongoDB Shell
- MongoDB University — бесплатные курсы
Заключение и рекомендации
MongoDB shell — это мощный инструмент, который должен быть в арсенале каждого сервер-администратора. Он позволяет не только выполнять базовые операции CRUD, но и проводить сложную аналитику, администрировать кластеры и автоматизировать рутинные задачи.
Основные рекомендации:
- Начинайте с простых команд и постепенно изучайте aggregation framework
- Всегда создавайте индексы для часто используемых полей
- Используйте explain() для анализа производительности запросов
- Настройте мониторинг и профилирование для production-окружения
- Регулярно делайте резервные копии с помощью mongodump
- Не забывайте про безопасность — настройте аутентификацию и авторизацию
MongoDB shell особенно полезен для DevOps-инженеров, которые работают с микросервисами, аналитическими системами и приложениями, требующими гибкой схемы данных. Если вы планируете серьезно заниматься MongoDB, обязательно изучите новый mongosh — он предоставляет улучшенный пользовательский опыт и дополнительные возможности.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.