Java и MongoDB: базовые операции

MongoDB — одна из наиболее популярных документноориентированных систем управления баз данных с открытым исходным кодом.

Для использования MongoDB в Java-проектах потребуется синхронный или асинхронный драйвер. В этой статье я опишу работу с синхронным драйвером.

Настройка проекта

Для использования MongoDB в синхронном режиме потребуется только соответствующий драйвер:

Подключение к MongoDB

Самый простой подключения к MongoDB — использование MongoClients.create():

По умолчанию клиент попробует подключиться к локальной MongoDB на порте 27017. Если подключение установить не получится, то будет возбуждено исключение. В качестве аргументов методу create можно передать строку подключения к MongoDB и дополнительные настройки подключения.

MongoClient расширяет интерфейсы Closeable и AutoCloseable, соответственно, объект этого типа может быть помещён в блок try-with-resources.

Работа с базами данных

Драйвер MongoDB предоставляет полноценный API для работы с базами данны.

Получение списка баз данных

Получить список доступных баз данных и их имён можно методами MongoClient.listDatabases() и MongoClient.listDatabaseNames() соответственно:

Создание и получение базы данных

База данных может быть создана и получена при помощи метода MongoClient.get():

Пользователь должен иметь доступ к указанной базе данных, в противном случае будет возбуждено исключение.

Удаление базы данных

База данных может быть удалена при помощи метода MongoDatabase.drop():

В результате выполнения команды база вместе со всеми коллекциями будет удалена. Пользователь должен иметь права на удаление базы.

Работа с коллекциями

Коллекции в MongoDB аналогичны таблицам в РСУБД, но они не имеют схемы и могут содержать документы с абсолютно разной структурой. На практике же в одной коллекции содержатся документы либо одного типа, либо объекты классов, реализующих один супертип.

Получение списка коллекций

Списки коллекций и имён коллекций в текущей базе данных могут быть получены при помощи методов MongoDatabase.listCollections() и MongoDatabase.listCollectionNames() соответственно:

Создание и получение коллекции

Коллекция может быть создана и получена при помощи метода MongoDatabase.getCollection():

Также коллекция может быть создана при помощи метода MongoDatabase.createCollection().

Удаление коллекции

Коллекцию можно удалить при помощи вызова метода MongoCollection.drop():

Работа с индексами

MongoDB, как и реляционные системы управления базами данных, позволяет использовать индексы для ускорения поиска по коллекциям.

Получение списка индесов

Список индексов можно получить вызовом метода MongoCollection.listIndexes():

Создание индекса

Индекс может быть создан при помощи метода MongoCollection.createIndex():

В качестве обязательного аргумента должен быть передан объект класса, реализующего интерфейс org.bson.BSON, в котором ключи — имена свойств коллекции, которые требуется индексировать, а значения — типы используемых индексов.

В качестве одного из дополнительных аргументов может быть передан объект типа IndexOptions, в котором можно указать дополнительные настройки индекса, например, его название.

В качестве примера приведено создание индекса по свойству dateCreated с сортировкой по возрастанию и названием idxDateCreated.

Также можно создать сразу несколько индексов при помощи метода MongoCollection.createIndexes().

Удаление индекса

Индекс может быть удалён в случае необходимости при помощи метода MongoCollection.dropIndex(). В качестве аргумента может быть передано название индекса или список индексируемых свойств.

Работа с документами

Данные в коллекциях MongoDB хранятся в виде документов. Формат хранения — BSON, или Binary JSON, очень похожий на стандартный JSON, но имеющий свои особенности. При работе с документами в Java по умолчанию используется класс org.bson.Document, реализующий Map из Collections API и представляющий документ в виде набора ключей и значений.

В настоящее время BSON выделен в отдельную библиотеку org.mongodb:bson, и его можно использовать без MongoDB. Его использование вместо стандартного JSON будет эффективнее, поскольку используется бинарная сериализация. Но при этом BSON менее эффективен, чем Protocol Buffers, поскольку имена свойств документа тоже участвуют в сериализации.

Создание документа

Для создания и сохранения документа в коллекции потребуется создать объект вышеупомянутого класса Document, добавить в него нужные пары ключей и значений и сохранить при помощи метода MongoCollection.insertOne() или MongoCollection.insertMany():

Обратите внимание, что по умолчанию в качестве первичного ключа в коллекциях MongoDB используется свойство _id, которое имеет тип ObjectId. Он, как и UUID, гарантирует уникальность и хранится в бинарном виде, однако более компактен (12 байт против 16). Если у документа не указано свойство _id, то MongoDB добавит его автоматически.

Поиск по документам

Для поиска по документам существует метод MongoCollection.find(). Он возвращает список документов и в качестве одного из аргументов может принимать документ, описывающий условия поиска. В качестве примера поиск по слову coffee в свойстве task:

Также есть дополнительные методы findOneAndUpdate, findOneAndReplace и findOneAndDelete, которые позволяют найти один документ и обновить, заменить и удалить его соответственно.

Изменение документов

Изменение документов в MongoDB реализовано при помощи методов
MongoCollection.updateOne() и MongoCollection.updateMany(). В качестве первого аргумента передаётся документ, описывающий условия выборки, а в качестве второго — документ, описывающий изменения, которые будут внесены в существующие документ(ы). Кроме изменения значений возможно добавление и удаление свойств. Например, в этом запросе значение свойства done заменяется на true, добавляется свойство dateDone и удаляется свойство dateCreated:

Обратите внимание, что если в качестве второго аргумента будет передан простой документ, то он полностью заменит документ. Для изменения отдельных свойств нужно пользоваться оператором $set.

Удаление документов

Для удаления документов используются методы MongoCollection.deleteOne() и MongoCollection.deleteMany(). В качестве аргумента передаётся документ, описывающий условия выборки. Если требуется удалить все документы в коллекции, то можно передать пустой документ.

Полезные ссылки