Spring boot MongoDb сложный запрос - PullRequest
0 голосов
/ 18 мая 2019

Я изучал реализацию MongoDB в Spring Boot. Однако у меня возникла проблема со сложными запросами.

Я не могу найти правильного решения о том, как реализовать сложные запросы к MongoDB из Spring при загрузке.

Я запрашиваю базу данных с реализацией интерфейса MongoRepository.

Допустим, у меня есть три коллекции:

  • Человек - 1 человек может иметь много домашних животных.
  • Pet - 1 питомец может иметь 1 PetToy и 1 человека, которому он принадлежит.
  • PetToy - 1 PetToy может принадлежать 1 питомцу.

POJO классы ниже

Чего я хочу достичь?

Я хочу сделать запрос, в который мне был бы возвращен Человек, у питомца которого есть Игрушка (PetToy) с именем «Тедди».

Я не мог найти способ, как это сделать. Кроме того, лучше ли даже использовать такие сложные запросы или лучше писать больше маленьких в MongoDB?

POJOs:

@Document
@Data
@ToString
public class Person {

    @Id
    private String id;

    private String firstname;

    private String lastname;

    private int age;

    @DBRef
    private Pet pet;
}

@Document
@Data
@ToString
public class Pet {

    @Id
    private String id;

    private String name;

    private int age;

    @DBRef
    private List<PetToy> toys;
}

@Document
@Data
@ToString
public class PetToy {

    @Id
    private String id;

    private String name;
}

Я пытался использовать MongoRepositories; однако я не смог сделать сложный запрос.

Как написать такой запрос в MongoDB из Spring Boot?

Заранее большое спасибо.

1 Ответ

1 голос
/ 19 мая 2019

Если вы можете использовать встроенные атрибуты, модель класса должна быть:

@Document
@Data
@Builder
public class Person {

    @Id
    private String id;

    private String firstName;

    private String lastName;

    private int age;

    private List<Pet> pets;
}
@Data
@Builder
public class Pet {

    private String name;

    private int age;

    private List<PetToy> toys;
}
@Data
@Builder
public class PetToy {

    private String name;
}

Хранилище с методом, который достигает того, что вы хотите:

public interface PersonRepository extends MongoRepository<Person, String> {
    List<Person> getByPetsToysName(String name);
}

Метод getByPetsToysName в основном перемещаетсямежду атрибутами человека Персона-> домашние животные-> игрушки-> имя.Подробнее здесь .

Пример

@Configuration
@EnableMongoRepositories
public class TestMongo implements CommandLineRunner {

  private final PersonRepository repository;

  public TestMongo(PersonRepository repository) {
    this.repository = repository;
  }

  @Override
  public void run(String... args) throws Exception {

    repository.save(Person.builder()
      .firstName("John")
      .lastName("Doe")
      .age(20)
      .pets(Stream.of(Pet.builder()
        .name("Ursa")
        .age(1)
        .toys(Stream.of(PetToy.builder()
          .name("Teddy")
          .build())
          .collect(Collectors.toList()))
        .build())
        .collect(Collectors.toList()))
      .build());

    repository.save(Person.builder()
      .firstName("Phillip")
      .lastName("Larson")
      .age(21)
      .pets(Stream.of(Pet.builder()
        .name("Bella")
        .age(5)
        .toys(Stream.of(PetToy.builder()
          .name("Lolo")
          .build())
          .collect(Collectors.toList()))
        .build())
        .collect(Collectors.toList()))
      .build());

    List<Person> persons = repository.getByPetsToysName("Teddy");
    System.out.println(persons.size());
    List<Person> persons1 = repository.getByPetsToysName("Lolo");
    System.out.println(persons1.size());
  }
}

Журналы:

find using query: { "pets.toys.name" : "Teddy" } fields: Document{{}} for class: class Person in collection: person

Если вам нужны более сложные запросы, вы можете посмотретьв документах Spring Data MongoDB .

...