我一直在春季启动中学习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文档。