Spring Boot MongoDB复杂查询



我一直在春季启动中学习mongoDB实现。但是,我在复杂的查询中遇到了问题。

我找不到如何从Spring Boot到MongoDB实现复杂查询的任何正确解决方案。

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

假设我有三个集合:

  • 人 - 1人可以有很多宠物。
  • 宠物-1个宠物可以有1个佩托伊和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;
}

我试图使用MongorePropositories;但是,我无法进行复杂的查询。

一个人如何将这样的查询从春季靴子中写给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;
}

用来实现您想要的方法的存储库:

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

getBypetStoySname方法基本上在人的属性人物 -> pets-> toys->名称之间导航。更多信息在这里。

一个例子

@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

如果您想要更复杂的查询,则可以查看春季数据mongodb文档。

最新更新