我一直在学习MongoDB在Spring Boot中的实现。然而,我遇到了复杂查询的问题。
对于如何从Spring Boot到MongoDB实现复杂查询,我找不到任何正确的解决方案。
POJO类是bellow的
我想实现什么?
我想做一个查询,这将返回给我一个人,他的宠物有一个玩具(PetToy)与名称“泰迪”。
@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;
}
事先非常感谢。
如果可以使用嵌入属性,则类模型应该是:
@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方法基本上在Person的属性person->pets->toys->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
如果您想要更复杂的查询,可以查看Spring Data MongoDB文档。
我有这个: 如何从hashlist中排除“item”?打破了我的头。Linq不想对我开放。
问题内容: 我有以下ManyToMany映射。 我想检索与Classe2实体有关系的所有Class1实体,其中class2Id = 1和class2Id = 2和class2Id = 3。{1,2,3} 或者,要过滤在其class2列表上具有的Classe1实体,请使用具有以下值的Class2实体:class2Id = 1和class2Id = 2和class2Id = 3 例如: 如果在联接表上
我有一张这样的桌子: 现在我想创建一个返回经过过滤的数据集的REST APIendpoint: 它应正确筛选API参数的任何组合。 所有参数都是可选的 看看这个示例: 我想要能够过滤基于每个参数或组合的2或参数。 我应该如何编写@RequestParam?这是一个复杂的查询。对此有何策略?
我对规范、构建器、查询不是很有经验,我必须做一个相当复杂的查询,就像这样: 我有一个这样的DTO: 对我来说很难。我什么都试过了。我宁愿给你看一个具体的案例,以免产生误解。有人能帮我吗?我将非常感激! 我不需要使用规范,我只需要能够重现那个查询示例,规范似乎是最好的选择。 谢谢大家。
给定集合"foo",我们有字段"bar",看起来像这样: 如何查询字段“bar”上满足以下条件的所有“foo”:[14,18]中的“uid”=2和“mid”
如何将这个复杂的sql语句更改为JPQL? 这是否可以在JPQL表单中显示?