Все большую популярность получают так называемые NoSQL базы данных, прекрасно подходящие для решения задач связанных с Big Data и распределенным хранением информации. В этой статье рассматривается работа с базой данных MongoDB, приводятся практические примеры создания основных объектов базы данных, организации поиска, а также, пример написания программы на языке программирования Java, для осуществления операций с данными.
MongoDB — это база данных NoSQL, в которой мы можем хранить данные в формате BSON, где ключ представляет свойство, а значение представляет значение свойства, хранящееся на ключе. [1]
В MongoDB документ представляет собой структуру данных, которая может содержать любое количество пар ключей и значений. Например, сотрудник компании может быть представлен как документ, в котором имя, адрес, возраст и его значение хранятся в виде пар ключ-значение в этом документе, он показан на Рис. 1. Обратите внимание, что документы хранятся в двоичном формате JSON, называемом BSON (двоичный JSON).
Рис. 1. Представление данных в JSON
В MongoDB часто документы с одинаковой структурой помещаются в хранилище, называемое коллекцией. Вы можете представить коллекцию в виде таблицы в реляционной базе данных, где каждая строка представляет собой документ. Поэтому мы можем сказать, что коллекция “Сотрудники” содержит несколько документов “Сотрудник”. По определению коллекция может содержать любые типы документов — например, коллекция может содержать документы “Сотрудники”, а также другие документы, например “Автомобили”. Нет никаких ограничений.
Примечание. При проектировании предпочтительнее создавать коллекцию на аналогично структурированных документах.
Отсутствие схем — одно из ключевых различий между базой данных SQL и NoSQL. Под NoSQL мы имеем в виду, что она не имеет предопределенной схемы — документ может содержать что-либо в формате BSON. Чтобы быть конкретным, любая структура данных вписывается в базу данных без схемы, поэтому она подходит для хранения неструктурированных данных.
Это облегчает жизнь разработчику, потому что в реляционной базе данных есть фиксированная схема. Если таблица “Сотрудники” содержит столбцы имени и адреса, она хранит все данные, которые поддерживают одну и ту же структуру данных. Чтобы добавить новый столбец “Возраст”, нам нужно полностью изменить схему, чтобы включить новое свойство. Но в MongoDB, мы можем поместить любую структуру данных с любой комбинацией свойств.
Примечание. Хотя MongoDB является без схемной, при проектировании мы логически помещаем одни и те же структурированные документы в коллекцию, поэтому он поддерживает неявную схему.
Успех Big Data заключается в горизонтальном масштабировании. Поскольку MongoDB является частью стека Big Data [2], она также поддерживает масштабирование. Благодаря горизонтальному масштабированию MongoDB может распространять данные на несколько узлов, каждый узел представляет собой недорогой компьютер — и мы можем легко добавлять и удалять узлы. Поэтому, когда нам нужно хранить больше данных, мы можем добавлять новые узлы, не влияя на существующую архитектуру, причем при вертикальном масштабировании нам нужен суперкомпьютер, а данные хранятся в одном централизованном хранилище.
Примечание. Распределяя данные по нескольким узлам, MongoDB становится отказоустойчивой системой. Если один узел теряет хранимую информацию, мы можем использовать другие для извлечения данных. Конечно, при вертикальном масштабировании, поскольку данные находятся в одной централизованной области, мы теряем все данные, так как находимся в единственной точке отказа.
Шардинг — это метод, с помощью которого MongoDB разбивает гигантские участки данных на мелкие. Затем она создает реплики каждого фрагмента и распределяет эти фрагменты на несколько узлов. При запросе клиент имеет информацию а метаданных, которые сообщают серверу MongoDB, какой именно узел хранит необходимые для выполнения запроса данные.
Для добавления данных и управлением нашей базой воспользуемся программой Robo 3T, доступной для загрузки онлайн. После подключения к MongoDB, создадим коллекцию “Сотрудники”, в которую добавим приведенный в пример ранее документ, результат выполнения операции добавления данных показан на Рис. 2.
Рис. 2. Интерфейс программы Robo 3T
Robo 3T позволяет производить только самые базовые операции с данными. В случае если перед вами стоит не стандартная задача, например нужно выполнить сложный поиск по базе данных или экспортировать данные в отдельный файл, я рекомендую пользоваться приложением, MongoLime, созданным Юрием Бушевым. Функциональные возможности данного приложения покрывают весь спектр действий и операций с данными, хранящимися в MongoDB, приложение является уникальным в своем роде и не имеет аналогов.
Для написания программы на Java, способной прочитать данных из MongoDB, нам потребуется: IDE Eclipse, плагин Maven и сама Java 8, установленная на рабочий компьютер [3]. Зависимости и базовую конфигурацию проекта поместим в pom.xml файл, изображенный на Рис. 3.
Рис. 3. Содержание файла pom.xml
Следующий этап это подключение к MongoDB серверу с использованием Java-кода. Я создам класс API верхнего уровня, который абстрагирует логику подключения к серверу MongoDB и предоставляет некоторые полезные методы для клиента API.
Здесь я создал объект Singleton MongoContext, который соединяется с MongoDB с использованием класса MongoClient в методе init. Обратите внимание, что класс MongoClient является частью официального Java-драйвера MongoDB.
Следующее, что нужно сделать, это выбрать базу данных для подключения. Я создал общий метод, называемый connectDb (String dbName), где вызывающий наш API будет передавать имя базы данных, к которой он хочет подключиться. Обратите внимание, что возвращаемый тип этого метода — сам MongoContext. Я использую технику Fluent API.
После этого я хочу выполнить запрос для извлечения документов из базы данных.
Здесь я создаю MongoContext, затем подключаем тестовую БД и вызываем метод findByKey, передавая Employee как коллекцию, возраст как ключ, а значение равно 34. После этого, используя лямбда-выражения, мы сообщим нашему API, что желаемый тип данных — целое.
В результате выполнения программы в консоль будет выведен результат запроса — запись из базы данных MongoDB, показанная на Рис. 4.
Рис. 4. Результат выполнения программы на Java
Литература:
- MongoDB // Link https://en.wikipedia.org/wiki/MongoDB (2018.05.31)
- What Is Big Data // Link: https://www.mongodb.com/big-data-explained (2018.06.13)
- Learn MongoDB With Java 8. Link: https://dzone.com/articles/learn-mongo-with-java8-part-1 (2018.05.11)