С момента своего появления MongoDB успела завоевать огромную популярность благодаря своей способности обрабатывать большие объемы данных. Ее принятие только растет, впрочем, как и сам рынок, на котором она востребована. Если вы нацелены связать свою карьеру с MongoDB, то сейчас самое время. Чтобы помочь вам на этом пути, мы подготовили список часто задаваемых вопросов по MongoDB с собеседований и ответов на них. MongoDB — это документоориентированная система управления базами данных, которая хранит данные в виде JSON-документов. В основе ее работы лежат концепции документов и коллекций. MongoDB может хранить несколько баз данных и обеспечивает высокую производительность, масштабируемость и избыточность. Этот перечень вопросов по MongoDB предназначен главным образом для того, чтобы дать вам представление о том, с какими вопросами вы можете столкнуться на реальном собеседовании. Обычно на собеседованиях рекрутеры начинают с простых вопросов и постепенно повышают уровень их сложности. Поэтому и в этой статье мы сначала рассмотрим самые простые вопросы, а затем перейдем к сложным. С помощью этих отобранных вопросов, вы сможете подготовиться к реальному собеседованию по MongoDB. Мы разделили вопросы по MongoDB (обновленный список 2023-го года) на 4 уровня: Самые популярные Основы Продвинутый уровень Для опытных пользователей Что такое MongoDB? Каковы главные фичи MongoDB? К какому типу NoSQL-баз данных относится MongoDB? Чем MongoDB отличается от MySQL? Для чего используется MongoDB? Каков синтаксис метода skip()? Как удалить все из базы данных MongoDB? Как мы выполняются Join-операции в MongoDB? Каковы типы данных в MongoDB? Как получить базу данных MongoDB в виде Javascript-массиве? MongoDB — это кроссплатформенная документо-ориентированная система управления базами данных. Относясь к категории NoSQL, MongoDB отказывается от традиционной таблично-ориентированной структуры реляционных баз данных в пользу JSON-документов с динамическими схемами, что делает интеграцию данных в приложениях более быстрой и простой. MongoDB была разработана компанией "10gen", в октябре 2007 года как компонент планируемой платформы в качестве сервисного продукта. После этого, в 2009 году компания перешла на модель разработки продуктов с открытым исходным кодом, предлагая коммерческую поддержку и другие услуги. Ниже перечислены несколько самых важных фич MongoDB: Удобная модель данных в формате документов. Гибкая и чрезвычайно масштабируемая база данных. Быстрее, чем традиционные базы данных. Наглядный язык запросов. MongoDB — это документо-ориентированная система управления базами данных. Она хранит данные в виде бинарных JSON-документов (BSON), которые в свою очередь организованы в коллекции. Пространство имен (namespace) представляет собой конкатенацию имени коллекции и имени базы данных. Несмотря на то что MySQL и MongoDB обе являются свободно распространяемыми базами данных с открытым исходным кодом, между ними существует ряд существенных различий, касающихся отношений между данными, транзакций, скорости работы, запросов данных, структуры схем, нормализации и т.д. Сравнение между MongoDB и MySQL по сути аналогично сравнению между нереляционными и реляционными базами данных. Больше почитать о сравнении MongoDB и MySQL можно здесь. В MongoDB для эффективного выполнения запросов используются вторичные индексы (Indexes), которые позволяют упорядочить данные по определенному полю, что впоследствии ускорит поиск. Например, если мы в своем приложении или задаче, как правило, выполняем поиск по полю name, то мы можем индексировать коллекцию по этому полю. Без индексов MongoDB должна была бы выполнить полное сканирование коллекции, т.е. перебрать все документы коллекции, чтобы выбрать те, которые бы соответствовали запросу. Если для запроса был создан подходящий индекс, то MongoDB будет использовать его для ограничения количества документов, которые необходимо просмотреть. MongoDB считается лучшей NoSQL-базой данных благодаря следующим особенностям: Высокая производительность Высокая доступность Легко масштабируется Полнофункциональный язык запросов Документо-ориентированность Полностью охватываемый индексами запрос (covered query) выполняется намного быстрее, так как индексы либо хранятся в оперативной памяти, либо расположены на диске последовательно. Когда критерии запроса включают только индексированные поля, MongoDB будет возвращать результаты непосредственно из индекса без сканирования каких-либо документов или переноса документов в память. Набор реплик (replica set) — это группа инстансов mongod (основной процесс mongoDB, задача которого — прием запросов, их обработка и выполнение), которые хранят копии одного и того же набора данных, обеспечивая избыточность и высокую доступность. Набор реплик состоит из одного первичного инстанса/узла (который принимает все операции записи) и одного или нескольких вторичных инстансов/узлов, которые синхронизируются с первичным. MongoDB Cassandra Это кроссплатформенная документо-ориентированная система управления базами данных. Это высокопроизводительная распределенная система управления базами данных. Разработана на языке C++ Разработана на языке Java Проста в администрировании при возникновении сбоев. Обеспечивает высокий уровень доступности. Ознакомьтесь с нашим сравнением Cassandra и MongoDB 11) Объясните, что такое первичный и вторичный узел в наборе реплик? В MongoDB первичные узлы — это узлы, принимающие записи. Первичные узлы также называются мастер-узлами. Репликация в MongoDB происходит по одному мастеру, поэтому только один узел будет принимать операции записи в один момент времени. В настоящее время MongoDB предлагает поддержку драйверов для C++, Java, PHP, Perl, Python, Go, Scala и Ruby. Все данные MongoDB в хранилище (или вообще в операционной системе) зашифровываются, что гарантирует, что только аутентифицированные процессы получат доступ к защищенным данным. Первичный набор реплик принимает все операции записи от клиентов. Вторичные наборы реплик реплицируют первичные наборы реплик и реализуют операции для своих наборов данных таким образом, что вторичные наборы данных отражаются также и на первичных наборах данных. GridFS: Мы используем GridFS для получения и хранения больших файлов, таких как изображения, видео и аудиофайлы. Журналирование: Мы используем журналирование для безопасного резервного копирования в MongoDB. В MongoDB не используется традиционный locking (такой, как скрипт автодоверия MySQL MyISAM) в угоду высокой скорости, понятности и легкости в представлении. Пожертвовав бизнес-транзакционностью мы можем повысить производительность, особенно в структуре с различными серверами. Когда происходит журналирование, мы сохраняем операции записи в памяти. Файлы журналов на диске (в подкаталоге dbPath journal) являются надежным средством, которое легко администрировать. MongoDB полагается на атомарность на уровне документа и оптимистичную блокировку, что позволяет одновременным читателям получать доступ к любому ресурсу, например коллекции или базе данных, в то же время предоставляя доступ отдельным писателям. Агрегация — это действия, которые обрабатывают записи данных и выдают результаты записи. Сегментирование (шардинг) означает хранение данных на нескольких машинах. MongoDB содержит профилировщик базы данных, который оценивает производительность каждой операции с базой данных. С помощью профилировщика мы можем определить запросы, которые выполняются медленнее, чем должны, и на основе этих данных определять, когда нам необходим индекс. Коллекция представляет собой набор документов MongoDB. Конвейер агрегации (Aggregation Pipeline) выступает в качестве основы для выполнения задач агрегирования. Мы используем этот конвейер для преобразования документов в агрегированные результаты. MapReduce — это стандартная многофазная модальность агрегации данных, которую мы используем для их обработки. Разбиение (splitting) — это фоновый процесс, который мы используем для хранения чанков, чтобы они не становились слишком большими. Метод save() используется для замены существующих документов на новые. Как правило, MongoDB используется в качестве основного хранилища данных для юзкейсов с большими операционными требованиями в реальном времени. В целом MongoDB подходит для 80% приложений, которые мы разрабатываем сегодня. MongoDB проста в эксплуатации и имеет такие возможности, которые с трудом достижимы при использовании реляционных баз данных. MongoDB занимает особое место в различных юзкейсах, когда реляционные базы данных не подходят, например, в приложениях с полуструктурированными и структурированными данными, а также при больших потребностях в масштабируемости или развертывании в нескольких дата-центрах. Для некоторых приложений MongoDB все же может не подходить. Например, MongoDB не подходит для приложений, предполагающих сложные транзакции, и приложений, задача которых заключается в сканировании, что предполагает работу с огромными количествами подмножеств данных. К числу стандартных применений для MongoDB относятся каталоги товаров, мобильные приложения, управление информационными ресурсами, персонализация в реальном времени, а также приложения, обеспечивающие индивидуальное представление данных в нескольких системах. Мы используем команду "db" в качестве имени текущей выбранной базы данных. Когда мы запускаем 32-разрядную версию MongoDB, общий размер хранилища сервера, содержащего индексы и данные, составляет всего 2 ГБ. По этой причине нам не стоит разворачивать MongoDB в продакшн на 32-разрядных машинах. Если же мы развернем 64-разрядную версию MongoDB, то виртуальных ограничений на размер хранилища не будет. мы настоятельно рекомендуем использовать для развертывания в продакшене 64-разрядные операционные системы и сборки. Это зависит от наших целей. Нормализация дает обновленное эффективное представление данных. Денормализация делает чтение данных эффективным. Как правило, мы используем встроенные модели данных, когда: Когда между нашими сущностями есть отношения «содержит». Когда между нашими сущностями есть отношения «один-ко-многим». В отношениях «многие» или дочерние документы отображаются в контексте родительских документов. Как правило, мы используем нормализованные модели данных: Если встраивание приводит к дублированию данных, и преимущества в производительности чтения не перекрываю влияние дублирования. Для представления более сложных отношений «многие-ко-многим». Для моделирования больших иерархических массивов данных. Для поиска любых данных в MongoDB мы используем метод find(). Метод discovery() возвращает документы коллекции, над которыми мы вызвали этот метод. Мы можем использовать в запросе к MongoDB выражение "Where", чтобы ограничить вывод с помощью проекции MongoDB. Каждый раз, когда мы выполняем метод find(), MongoDB возвращает все документы, связанные с конкретной коллекцией.  Для имитации простого подзапроса или join в SQL в MongoDB нам необходимо найти наилучший метод структурирования данных. Например, у нас есть пользователи и сообщения, причем пользователи находятся в одной коллекции, а сообщения — в другой. Нам нужно найти все сообщения пользователей, чей город "Hyderabad". Оперативный журнал (oplog) — это особый вид ограниченной коллекции, в которой хранится запись всех операций, изменяющих данные, которые мы храним в наших базах данных. В первую очередь все операции с базой данных выполняются над первичным узлом, после чего эти операции записываются в oplog первичного узла. После этого вторичные узлы реплицируют и применяют операции в асинхронном порядке. Когда я хочу создать базу данных в MongoDB, я сталкиваюсь со следующей ошибкой: Решение данной ошибки: cd/var1/lib1/MongoDB Удаляем mongod.lock из папки Sudo start MongoDB Mongo Синтаксис метода skip() следующий: Используя следующий код, мы можем полностью очистить базу данных MongoDB: Для создания резервной копии базы данных мы используем команду mongodump. Для восстановления резервной копии мы используем mongorestore. В MongoDB для доступа к элементам массива и полям встроенного документа используется точечная нотация. Синтаксис метода limit() имеет вид: Синтаксис метода sort() имеет вид: NoSQL означает "Not Only SQL". NoSQL — это разновидность базы данных, которая обрабатывает и сортирует все виды структурированных, массивных и сложных данных. Это переосмысление традиционных баз данных. Виды NoSQL баз данных: На основе ключ-значение Графовые Столбчатые/Колоночные Документо-ориентированные  Для сброса базы данных мы используем команду DB.drop database. В MongoDB для выбора только нужных нам данных мы используем проекцию. Она не будет выбирать все данные документа. Метод pretty() используется для отображения результатов в отформатированном виде. Используя метод remove(), мы можем удалить документ из коллекции. При создании схемы необходимо учитывать следующие моменты: Основой для структуры схемы должны служить требования пользователя. Объединяйте объекты в один документ, если их нужно использовать совместно, а если нет, то, наоборот, разделяйте их по разным документам. Выполняйте объединения во время записи, а не во время чтения. Для большинства общих сценариев применения следует максимизировать схему. Выполняйте сложные агрегации в схеме. ObjectId содержит следующее: Идентификатор клиентской машины Идентификатор клиентского процесса Счетчик с байтовым инкрементом Таймстемп Например, если нам необходимо выбрать все атрибуты и группы по имени во всех записях. Например: Агрегация в MongoDB может быть выполнена следующим образом: Вертикальное масштабирование: При вертикальном масштабировании увеличиваются ресурсы памяти и процессора для расширения общей емкости. Горизонтальное масштабирование: Горизонтальное масштабирование разделяет наборы данных и распределяет их по нескольким хранилищам или серверам. Ниже перечислены элементы сегментированного кластера: Маршрутизаторы запросов  Сегменты/шарды Конфигурационные серверы Ниже перечислены популярные альтернативы MongoDB: Hbase CouchDB Cassandra Redis Riak В ходе общих операций по балансировке сегментов мы создаем резервные копии старых файлов, которые можно удалить по завершении этих операций. Storage Engine — это компонент базы данных, отвечающий за управление хранением данных на диске. Например, один механизм хранения может обеспечивать лучшую производительность для рабочих нагрузок, связанных с чтением, а другой — большую пропускную способность для операций записи. Нет, MongoDB не требует большого объема оперативной памяти. Она может работать на небольшом объеме памяти. MongoDB динамически выделяет и высвобождает оперативную память в зависимости от потребностей других процессов. MongoDB CouchDB MongoDB работает быстрее, чем CouchDB. CouchDB более безопасна, чем MongoDB. В MongoDB нет триггеров. В CouchDB есть триггеры. MongoDB сериализует JSON-данные в BSON CouchDB не хранит данные в формате JSON Ограниченная (capped) коллекция — это особый вид коллекции в MongoDB, размер которой мы можем ограничить. Синтаксис ограниченной коллекции выглядит следующим образом: В этом синтаксисе содержатся следующие поля: collection_name: Это поле представляет собой имя коллекции, которую мы создаем в качестве ограниченной коллекции. capped: Capped — это логический флаг; он должен быть установлен в true, если мы хотим сделать коллекцию ограниченной. По умолчанию его значение равно false. autoIndexed: Это флаг, который мы используем для автоиндексации. Если этот флаг равен true, то индексы будут создаваться автоматически. Если флаг равен false, то индексы создаваться автоматически не будут. size: Size — это параметр, представляющий максимальный объем документов в байтах. Это обязательное поле в контексте ограниченных коллекций. max: Max — это параметр, представляющий наибольшее количество документов, которое допускает коллекция.  Начиная с MongoDB3.2, мы можем выполнять операцию Join. Новый оператор $lookup, входящий в состав конвейера агрегации, аналогичен левому внешнему join. Пример: WiredTiger и MMAPv1 — два механизма хранения данных, используемых в MongoDB. В MongoDB мы не можем настраивать кэш. MongoDB использует свободное пространство в системе автоматически, используя файлы с привязкой к памяти. Мы можем управлять производительностью MongoDB с помощью: Устранение дефицита ресурсов Определение количества соединений Профилирование баз данных Полный захват диагностических данных Ниже перечислены агрегатные функции MongoDB: AVG Sum Min Max First Push addTo Set Last Ниже перечислены CRUD-операции в MongoDB: Ниже перечислены типы данных MongoDB: Целое число (Integer) Строка (String) Логическая переменная (Boolean) Массив (Array) Вещественное число двойной точности (Double) Дата (Date) Таймстемп (Timestamp) Регулярное выражение (Regular Expression) Нет, вызывать "get last error" не требуется. Сервер ведет себя так, как будто она была вызвана. "get last error" позволяет нам получить подтверждение того, что операция записи зафиксирована. Вы получите подтверждение, но надежность и безопасность записи от этого не зависят. Если сегмент работает медленно, запрос возвращает ошибку до тех пор, пока не будут исправлены параметры запроса. Когда сегмент реагирует медленно, MongoDB ожидает его. Поле "_id" является негласным первичным ключом в MongoDB. И оно является уникальным значением. Если мы ничего не зададим в поле "_id", то оно систематически будет заполняться "MongoDB Id Object". Тем не менее, мы можем хранить в этом поле любую уникальную информацию. Для просмотра соединений, используемых MongoDB, мы используем команду db_adminCommand("connPoolStats"). Нет, очищать частично перемещенные документы не требуется, поскольку перемещение чанков детерминировано и последовательно. Перемещение будет повторено, и по его завершении данные окажутся в нужном сегменте. Для запуска сервера MongoDB необходимо выполнить следующие действия: Во-первых, откройте командную строку и выполните файл "mongod.exe". Далее, мы переходим по пути, по которому мы установили MongoDB. Перейдите в папку bin, найдите файл "mongod.exe" и дважды кликните по нему. Мы можем перейти в папку, например, "C: MongoDB/bin" и ввести mongo для подключения MongoDB с помощью оболочки Shell. Критерий для сравнения MongoDB РСУБД Определение Это нереляционная система управления базами данных Это реляционная система управления базами данных Работа Это документо-ориентированная система баз данных с использованием полей и документов Она работает с отношениями между таблицами, в которых используются строки и столбцы Масштабируемость Вертикальная и горизонтальная масштабируемость Она вертикально масштабируема Производительность Производительность увеличивается по мере роста числа процессоров Производительность увеличивается с ростом объема оперативной памяти Иерархическое хранение данных В ней имеется встроенная возможность хранения иерархических данных Трудно хранить иерархические данные Поддержка join’ов Не поддерживает сложносоставные join’ы Поддерживает сложные соединения join’ы Язык запросов Для запросов к базе данных используется BSON Для запроса к базе данных используется SQL Поддержка Javascript Обеспечивает поддержку javascript-клиентов для выполнения запросов к базе данных Не обеспечивает поддержку запросов к базе данных со стороны javascript-клиентов Приложения получают доступ к модификациям данных в реальном времени через Change-потоки, которые служат подписчиками для каждой операции сбора данных, такой как удаление, вставка и обновление. Ниже перечислены различные виды индексов в MongoDB: Индекс по умолчанию (default): Это "_id", который создает MongoDB. Составной (compound): Применяется для нескольких полей. Множество ключей (multi-key): Индексирует данные массива. Одно поле (single field): Сортировка и индексирование по одному полю. Геопространственный (geospatial): Применяется для запроса данных о местоположении. Хешированный (hashed): Индексирует хэши нескольких полей. Двоичный JSON или BSON — это двоично-закодированный формат JSON. BSON расширяет JSON и предлагает различные поля и типы данных. Поскольку MongoDB является документо-ориентированной базой данных, документы хранятся в формате Binary Javascript Object Notation или BSON, который представляет собой двоично-закодированный формат JSON. Да, MongoDB поддерживает ACID-транзакции. ACID означает "атомарность", "согласованность", "изоляция" и "долговечность". Менеджер транзакций гарантирует, что мы удовлетворяем этим атрибутам.   В MongoDB ObjectID связан с полем "_id", и MongoDB использует его в качестве значения по умолчанию для "_id" в документах. Для генерации "ObjectID" мы используем следующий синтаксис: Пример: ObjectID имеет следующие методы: str: Этот метод обеспечивает строковое представление идентификатора объекта. valueOf(): Этот метод возвращает шестнадцатеричное представление ObjectId. getTimeStamp(): Этот метод возвращает таймстемп ObjectId. toString(): Этот метод возвращает строковое представление ObjectId в формате "ObjectId(haxstring)". Например, если у нас есть следующие документы: Мы выполняем следующую команду: 76) Как можно отсортировать пользовательскую функцию? Например, если x и y — целые числа, то как вычислить "x-y"? Выполнив следующий код, мы вычислим x-y. Используя конвейер агрегации и оператор "" class="formula inline">orderby", можно производить сортировку. MongoDB зиждется на коллекциях. Поэтому мы храним все субстанции в единой массе или куске. Когда у нас есть дополнительный временной слот, то у нас будет несколько вариантов достижения данных в виде слайсов, а когда у нас несколько кусков, то данные будут расширены до множества слайсов.  В терминале MongoDB мы можем выполнить команду "Show DBS" для получения существующих баз данных. Чтобы получить базы данных MongoDB программным путем, выполним следующий код: Выполнив следующий код, мы обновим объект: У меня есть коллекция, в которой есть встроенный документ, известный как notes.  Для запросов со вложенными join мы используем "tested". Например: Да, мы можем выполнять несколько операций javascript в одном инстансе MongoDB. Уверенные навыки по созданию отказоустойчивых кластеров Mongo можно получить на онлайн-курсе MongoDB в Отус.  Редактор