Перейти к основному содержимому

Руководство MongoDB BSON

· 6 мин. чтения

1. Введение

В этом руководстве мы рассмотрим BSON и то, как мы можем использовать его для взаимодействия с MongoDB .

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

MongoDB — это распределенный механизм хранения документов NoSQL. Документы хранятся как данные BSON и группируются в коллекции. Документы в коллекции аналогичны строкам в таблице реляционной базы данных .

Для более подробного ознакомления ознакомьтесь со вводной статьей о MongoDB .

2. Что такое БСОН ?

BSON означает двоичный JSON . Это протокол для двоичной сериализации JSON-подобных данных.

JSON — это формат обмена данными, популярный в современных веб-сервисах. Он обеспечивает гибкий способ представления сложных структур данных.

BSON предоставляет несколько преимуществ по сравнению с обычным JSON:

  • Компактность: в большинстве случаев для хранения структуры BSON требуется меньше места, чем для ее эквивалента JSON .
  • Типы данных: BSON предоставляет дополнительные типы данных, которых нет в обычном JSON, например Date и BinData.

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

3. Драйвер MongoDB

Теперь, когда у нас есть общее представление о BSON и MongoDB, давайте посмотрим, как использовать их вместе. Мы сосредоточимся на основных действиях из аббревиатуры CRUD ( создать , прочитать , обновить , удалить ). ** ** ****

MongoDB предоставляет программные драйверы для большинства современных языков программирования. Драйверы построены на основе библиотеки BSON , что означает, что при построении запросов мы будем работать напрямую с BSON API. Дополнительные сведения см. в нашем руководстве по языку запросов MongoDB .

В этом разделе мы рассмотрим использование драйвера для подключения к кластеру и использование API BSON для выполнения различных типов запросов. Обратите внимание, что драйвер MongoDB предоставляет класс Filters , который может помочь нам написать более компактный код. Однако в этом руководстве мы сосредоточимся исключительно на использовании основного API BSON.

В качестве альтернативы использованию драйвера MongoDB и BSON напрямую взгляните на наше руководство по Spring Data MongoDB .

3.1. Подключение

Для начала мы сначала добавим драйвер MongoDB в качестве зависимости в наше приложение:

<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>3.10.1</version>
</dependency>

Затем мы создаем соединение с базой данных и коллекцией MongoDB:

MongoClient mongoClient = MongoClients.create();
MongoDatabase database = mongoClient.getDatabase("myDB");
MongoCollection<Document> collection = database.getCollection("employees");

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

3.2. Вставлять

Допустим, у нас есть следующий JSON, который мы хотим вставить как новый документ в коллекцию сотрудников :

{
"first_name" : "Joe",
"last_name" : "Smith",
"title" : "Java Developer",
"years_of_service" : 3,
"skills" : ["java","spring","mongodb"],
"manager" : {
"first_name" : "Sally",
"last_name" : "Johanson"
}
}

В этом примере JSON показаны наиболее распространенные типы данных, с которыми мы сталкиваемся в документах MongoDB: текстовые, числовые, массивы и встроенные документы.

Чтобы вставить это с помощью BSON, мы использовали бы Document API MongoDB:

Document employee = new Document()
.append("first_name", "Joe")
.append("last_name", "Smith")
.append("title", "Java Developer")
.append("years_of_service", 3)
.append("skills", Arrays.asList("java", "spring", "mongodb"))
.append("manager", new Document()
.append("first_name", "Sally")
.append("last_name", "Johanson"));
collection.insertOne(employee);

Класс Document — это основной API, используемый в BSON. Он расширяет интерфейс Java Map и содержит несколько перегруженных методов. Это упрощает работу с собственными типами, а также с обычными объектами, такими как идентификаторы объектов, даты и списки.

3.3. Находить

Чтобы найти документ в MongoDB, мы предоставляем поисковый документ, в котором указывается, какие поля запрашивать. Например, чтобы найти все документы с фамилией «Смит», мы будем использовать следующий документ JSON:

{  
"last_name": "Smith"
}

Написано в BSON это будет:

Document query = new Document("last_name", "Smith");
List results = new ArrayList<>();
collection.find(query).into(results);

Запросы «Найти» могут принимать несколько полей, и поведение по умолчанию заключается в использовании логического оператора и для их объединения. Это означает, что будут возвращены только те документы, которые соответствуют всем полям .

Чтобы обойти это, MongoDB предоставляет оператор запроса или :

{
"$or": [
{ "first_name": "Joe" },
{ "last_name":"Smith" }
]
}

Это найдет все документы, которые имеют либо имя «Джо», либо фамилию «Смит». Чтобы записать это как BSON, мы будем использовать вложенный документ , как и запрос на вставку выше:

Document query = 
new Document("$or", Arrays.asList(
new Document("last_name", "Smith"),
new Document("first_name", "Joe")));
List results = new ArrayList<>();
collection.find(query).into(results);

3.4. Обновлять

Запросы на обновление немного отличаются в MongoDB, поскольку для них требуются два документа :

  1. Критерии фильтрации для поиска одного или нескольких документов
  2. Документ обновления, указывающий, какие поля следует изменить.

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

В JSON эти два запроса будут выглядеть так:

{
"skills": {
$elemMatch: {
"$eq": "spring"
}
}
}

{
"$push": {
"skills": "security"
}
}

А в BSON они будут такими:

Document query = new Document(
"skills",
new Document(
"$elemMatch",
new Document("$eq", "spring")));
Document update = new Document(
"$push",
new Document("skills", "security"));
collection.updateMany(query, update);

3.5. Удалить

Запросы на удаление в MongoDB используют тот же синтаксис, что и запросы на поиск. Мы просто предоставляем документ, в котором указывается один или несколько критериев для соответствия.

Например, предположим, что мы нашли ошибку в нашей базе данных сотрудников и случайно создали сотрудников с отрицательным значением выслуги лет. Чтобы найти их все, мы будем использовать следующий JSON:

{
"years_of_service" : {
"$lt" : 0
}
}

Эквивалентным документом BSON будет:

Document query = new Document(
"years_of_service",
new Document("$lt", 0));
collection.deleteMany(query);

4. Вывод

В этом руководстве мы увидели базовое введение в построение запросов MongoDB с использованием библиотеки BSON. Используя только BSON API, мы реализовали основные операции CRUD для коллекции MongoDB.

Мы не рассмотрели более сложные темы, такие как проекции, агрегации, геопространственные запросы, массовые операции и многое другое. Все это возможно, используя только библиотеку BSON. Примеры, которые мы видели здесь, образуют строительные блоки, которые мы будем использовать для реализации этих более сложных операций.

Как всегда, вы можете найти приведенные выше примеры кода в нашем репозитории GitHub .