Spring引导MongoDb复杂查询

Spring引导MongoDb复杂查询,spring,mongodb,spring-boot,mongodb-query,spring-data,Spring,Mongodb,Spring Boot,Mongodb Query,Spring Data,我一直在学习SpringBoot中的MongoDB实现。 但是,我遇到了一个复杂查询的问题 对于如何从Spring boot实现对MongoDB的复杂查询,我找不到任何正确的解决方案 我正在使用MongoRepository接口实现查询数据库 假设我有三个系列: 一个人可以养很多宠物。 宠物-1只宠物可以有一个宠物玩具和一个主人。 宠物玩具-1只宠物玩具可以属于1只宠物。 POJO课程如下 我想要实现什么 我想做一个查询,它将返回给我一个人,他的宠物有一个名为泰迪的玩具 我找不到一个方法来做这件

我一直在学习SpringBoot中的MongoDB实现。 但是,我遇到了一个复杂查询的问题

对于如何从Spring boot实现对MongoDB的复杂查询,我找不到任何正确的解决方案

我正在使用MongoRepository接口实现查询数据库

假设我有三个系列:

一个人可以养很多宠物。 宠物-1只宠物可以有一个宠物玩具和一个主人。 宠物玩具-1只宠物玩具可以属于1只宠物。 POJO课程如下

我想要实现什么

我想做一个查询,它将返回给我一个人,他的宠物有一个名为泰迪的玩具

我找不到一个方法来做这件事。此外,使用这样复杂的查询是最佳实践,还是在MongoDB中编写更多的小查询更好

POJO:

@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;但是,我无法进行复杂的查询

如何从Spring Boot将这样的查询写入MongoDB


非常感谢您。

如果您可以使用嵌入式属性,则类模型应为:

@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;
}

如果您想要更复杂的查询,可以查看。

在Person->Pet和Pet->Pet Toys之间的关系中使用@DBRef而不是嵌入属性有什么理由吗?我使用@DBRef,因为我想知道如何连接来自不同集合的两个文档。这仅仅是一个例子。谢谢你,我认为如果可能的话,最好使用嵌入式文档。在这种情况下,当您必须使用文档引用时,您可能应该使用聚合框架。
public interface PersonRepository extends MongoRepository<Person, String> {
    List<Person> getByPetsToysName(String name);
}
@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