Spring引导MongoDb复杂查询
我一直在学习SpringBoot中的MongoDB实现。 但是,我遇到了一个复杂查询的问题 对于如何从Spring boot实现对MongoDB的复杂查询,我找不到任何正确的解决方案 我正在使用MongoRepository接口实现查询数据库 假设我有三个系列: 一个人可以养很多宠物。 宠物-1只宠物可以有一个宠物玩具和一个主人。 宠物玩具-1只宠物玩具可以属于1只宠物。 POJO课程如下 我想要实现什么 我想做一个查询,它将返回给我一个人,他的宠物有一个名为泰迪的玩具 我找不到一个方法来做这件事。此外,使用这样复杂的查询是最佳实践,还是在MongoDB中编写更多的小查询更好 POJO: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课程如下 我想要实现什么 我想做一个查询,它将返回给我一个人,他的宠物有一个名为泰迪的玩具 我找不到一个方法来做这件
@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