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

Руководство по @DBRef в MongoDB

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

1. Обзор

В этом руководстве мы рассмотрим аннотацию Spring Data MongoDB @DBRef . Мы будем подключать документы MongoDB, используя эту аннотацию. Кроме того, мы увидим типы ссылок на базы данных MongoDB и сравним их.

2. Руководство по базе данных MongoDB.

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

При использовании ручных ссылок мы сохраняем _id ссылочного документа в другом документе.

Позже, когда мы запрашиваем данные из первой коллекции, мы можем запустить второй запрос для получения документов, на которые есть ссылки.

3. Spring Data MongoDB @DBRef Аннотация

DBRef похожи на ручные ссылки в том смысле, что они также содержат _id ссылочного документа . Однако они содержат коллекцию ссылочного документа в поле $ref и, возможно, его базу данных, а также в поле $db .

Преимущество этого перед ручными ссылками заключается в том, что он уточняет, на какую коллекцию мы ссылаемся.

4. Настройка приложения

4.1. Зависимость

Во-первых, нам нужно добавить необходимые зависимости для использования MongoDB с Spring Boot.

Давайте добавим spring-boot-starter-data-mongodb в наш pom.xml :

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

4.2. Конфигурация

Теперь мы настроим соединение, добавив следующую конфигурацию в файл application.properties :

spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=person_database

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

Opened connection [connectionId{localValue:2, serverValue:37}] to localhost:27017

Это означает, что приложение может успешно подключиться к MongoDB.

4.3. Коллекции

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

В этом примере мы будем работать с тремя разными типами данных: Person , Dog и Cat . Мы свяжем людей с их домашними животными.

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

Во-первых, давайте создадим базу данных с именем person_database и создадим в ней две коллекции с именами Dog и Cat. Мы будем вставлять по одному документу в каждый из них. Для упрощения оба они будут иметь только одно свойство: имя питомца.

Давайте вставим этот документ в коллекцию Dog :

{
_id: ObjectID("622112d71f9dac417b84227d"),
name: "Max"
}

Затем давайте вставим этот документ в коллекцию Cat :

{
_id: ObjectID("622112781f9dac417b84227b"),
name: "Loki"
}

Теперь создадим коллекцию Person и вставим в нее документ:

{
_id: ObjectId(),
name: "Bob",
pets: [
{
"$ref": "Cat",
"$id": "622112781f9dac417b84227b",
"$db": ""
},
{
"$ref": "Dog",
"$id": "622112d71f9dac417b84227d",
"$db": ""
}
]
}

Мы предоставляем домашних животных в виде массива. Элементы массива должны соответствовать определенному формату, чтобы их можно было использовать в качестве DBRef s. Нам нужно указать имя коллекции в свойстве $ref . В данном случае это Кошка и Собака . Затем мы включаем идентификатор ссылочных документов. Наконец, мы можем дополнительно включить имя базы данных в свойство $db , если мы хотим ссылаться на коллекции из другой базы данных.

5. Использование аннотации @DBRef

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

Для упрощения мы не будем создавать отдельные классы для типов данных Dog и Cat . Вместо этого мы будем использовать класс Pet , который содержит идентификатор и имя:

public class Pet {
private String id;
private String name;

@Override
public String toString() {
return "Pet [id=" + id + ", name=" + name + "]";
}

// standard getters and setters
}

Теперь мы создадим класс Person и включим ассоциацию с классом Pet через @DBRef:

@Document(collection = "Person")
public class Person {

@Id
private String id;

private String name;

@DBRef
private List<Pet> pets;

@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", pets=" + pets + "]";
}

// standard getters and setters
}

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

public interface PersonRepository extends MongoRepository<Person, String> {}

Мы проверим все, создав ApplicationRunner , который выполняет запрос MongoDB при запуске приложения. Давайте переопределим метод run() и поместим оператор журнала, чтобы мы могли видеть содержимое коллекции Person :

@Override
public void run(ApplicationArguments args) throws Exception {
logger.info("{}", personRepository.findAll());
}

Это создает вывод журнала, аналогичный этому, потому что мы переопределили метод toString() в наших классах сущностей:

com.foreach.mongodb.dbref.DbRefTester : [Person [id=62249c5c7ffe83c50ad12700, name=Bob, pets=[Pet [id=622112781f9dac417b84227b, name=Loki], Pet [id=622112d71f9dac417b84227d, name=Max]]]]

Это означает, что мы успешно прочитали и объединили документы из разных коллекций.

5.1. Ссылка на другую базу данных

Аннотация @DBRef принимает два параметра. Одним из них является параметр db , который можно использовать для ссылки на документы в других базах данных.

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

В нашем случае, если бы кошка или собака находились в другой базе данных с именем pet_database, нам нужно было бы изменить аннотацию на это: @DBRef(db = «pet_database») .

5.2. Ленивая загрузка

Другой параметр, принимаемый аннотацией, называется lazy . Это логическое значение, которое определяет, должны ли документы, на которые есть ссылки, загружаться лениво или нет.

По умолчанию оно равно false , что означает, что ссылки будут загружаться с нетерпением, когда мы запрашиваем основной объект. Если мы включим эту функцию, документы, на которые есть ссылки, не будут загружаться до тех пор, пока к ним не будет получен доступ в первую очередь.

6. Заключение

В этой статье мы сравнили справочные материалы MongoDB со Spring Data MongoDB @DBRef. Мы создали три коллекции и связали их этой аннотацией. Мы создали приложение Spring Boot для запроса этих коллекций с помощью MongoRepository и отображения связанных документов.

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