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 .