
Что такое MongoDB
MongoDB — это документо-ориентированная система управления базами данных. В отличие от реляционных баз данных, где данные хранятся в таблицах с фиксированной схемой, здесь данные хранятся в документах формата BSON. BSON можно рассматривать как бинарный JSON с дополнительными типами данных, который эффективен для хранения и обработки данных.
MongoDB – очень эффективная и производительная система управлениями баз данных. Из коробки она поддерживает возможность горизонтального масштабирования с помощью шардирования, благодаря чему данные распределяются по нескольким серверам, повышая тем самым производительность и отказоустойчивость системы.
Структура хранения данных в MongoDB
MongoDB имеет гибкую структуру хранения данных. Данные в ней хранятся в коллекциях, которые состоят из документоов.

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

mongod (мо́нгоди)— это основной процесс сервера MongoDB, который отвечает за обработку запросов, управление данными и выполнение операций с базой данных. Он предоставляет доступ к данным и является самым ключевым компонентом.
mongos (мо́нгос) — это процесс, который используется в шардированных кластерах MongoDB для взаимодействия с различными шардами. Он действует как маршрутизатор запросов и направляет их в определенные шарды и обеспечивает распределенную обработку запросов.
mongosh (мо́нго-шелл) — это консольная утилита, с помощью которой мы как конечные пользователи можем общаться с mongodb – выполнять запросы, создавать и изменять данные, управлять индексами и выполнять прочие команды.

Установка
Установка на mac OS через Homebrew
Если вы используете mac, то проще всего воспользоваться менеджером пакетов homebrew. Устанавливается MongoDB в этом случае просто:
brew tap mongodb/brew
brew update
brew install mongodb-community@8.0После успешной установки MongoDB в этом запускается с помощью команды brew services start:
brew services start mongodb-communityДля подключения к MongoDB достаточно просто написать mongosh:
mongoshВыйти из консоли MongoDB можно с помощью команды exit:
test> exit;Установка на другие платформы
Установка с помощью Docker
docker run -d -p 27017:27017 mongodb/mongodb-community-server:latestПодключиться в этом случае к MongoDB можно через контейнер
docker exec -it <id_контейнера> mongosh Работа с MongoDB
Посмотреть список всех доступных баз данных
show dbsСоздать или переключиться на базу данных mydb
use mydbПосмотреть все коллекции текущей базы данных
show collectionsБазовые команды
Создать коллекцию users и добавить в нее одну запись
db.users.insertOne({ name: "Alex", age: 25 })Добавить несколько документов в коллекцию users
db.users.insertMany([
{ name: "Mike", age: 19, verified: true },
{ name: "Bob", age: 31, email: "bob@gmail.com" }
])Получить все записи коллекции users
db.users.find()Ограничить результат до двух документов
db.users.find().limit(2)Получить 2 документа, начиная со второго
db.users.find().limit(2).skip(1)Получить пользователей отсортированных по полю age
db.users.find().sort({age: 1})Если необходимо сортировать по убыванию
db.users.find().sort({age: -1})Поиск по условию – ищем документы со значением поля name ‘Bob’
db.users.find({name: "Bob"})
[
{
_id: ObjectId('671e30c8a43271d646ecda7e'),
name: 'Bob',
age: 31,
email: 'bob@gmai.com'
}
]Найти пользователей с возрастом меньше 30 лет
db.users.find({age: {$lt: 31}})Найти документы в коллекции пользователей, у которых присутствует поле email
db.users.find({email: {$exists: true}})Найти все документы коллекции users, у которых значение поля age может быть одним из переданных значений 19, 25, 29:
db.users.find({age: {$in: [19, 25, 29]}})Для составных условий используются операторы AND
db.users.find({ $and: [{ age: {$gt: 20} }, { email: {$exists: false} }] })или OR
db.users.find({ $or: [{ age: {$gt: 20} }, { email: {$exists: false} }] })Для логического НЕ используется оператор NOT
db.users.find({ name: { $not: { $eq: "Bob" } } })Для поиска по вложенным полям необходимо написать полный путь к этому полю от корня документа. Запрос для получения документов с городом Лиссабон в поле адрес:
db.users.find({ 'adress.city': 'Lisboa'})Для получения количества документов в коллекции:
db.users.countDocuments({ age: { $gt: 30 } })Для обновления документов в MongoDB используются updateMany и updateOne.
Команда которая увеличит значение поля age у всех документов
db.users.updateMany({}, { $inc: { age: 1 } })Команда переименовывающая поле adress в поле address во всех документах, где такое поле существует:
db.users.updateMany({ adress: { $exists: true } }, { $rename: { "adress": "address" } })Чтобы обновить один документ, используется команда updateOne.
Добавление нового поля в документ по его _id:
db.users.updateOne({_id: ObjectId('6724c2230671ef2ba17353ba')}, {$set: {newField: 'abc'}})Добавление элемента в поле типа массив в документе:
db.users.updateOne({ _id: ObjectId('6724c2230671ef2ba17353ba') }, { $push: { permissions: 'create_post' } } )Удаление элемента из поля типа массив в документе:
db.users.updateOne({ _id: ObjectId('6724c2230671ef2ba17353ba') }, { $pull: { permissions: 'delete_post' } } )Для удаления одного документа необходимо использовать deleteOne, а для удаления нескольких deleteMany.
Команда которая удалит всех пользователей с возрастом больше 30 лет:
db.users.deleteMany({age: {$gt: 30}})Помимо удаления документов, можно удалить всю коллекцию целиком. В этом случае удаляется коллекция и все документы в ней.
Удаляется коллекция с помощью команды drop:
db.users.drop()Можно также удалить целиком базу данных со всеми ее коллекциями:
db.dropDatabase()Индексы
Создание индекса в коллекции пользователей по полю age
db.users.createIndex({ age: 1 })Создание индекса в коллекции пользователей по полю age по возрастанию и полю name по убыванию:
db.users.createIndex({ age: 1, , name: -1 })Посмотреть все индексы коллекции:
db.users.getIndexes()Если индекс нам больше не нужен, то удалить его можно с помощью команды dropIndex
db.users.dropIndex('age_-1_name_1')