springboot使⽤mongodb基本使⽤,DBRef基本使⽤
这⾥记录⼀下⾃⼰学习和使⽤mongodb的⼀些过程和经验。
mongodb和mysql结合话不多说,直接开始
新建⼀个springboot项⽬,导⼊mongo依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
yml⽂件加⼊mongo配置,有密码的加上密码
spring:
#mongo配置
data:
mongodb:
database: testMongodb
uri: mongodb://127.0.0.1:27017
⽤过mongodb的应该都清楚,mongodb不能多表关联查询,不能⼦查询。但是实际⼯作中,经常会遇到要求关联查询的情况,我们也必须去想办法解决。⽐如现在有⼀个学⽣表,和⼀个班级表,学⽣表中没有班级名字段,⼀个学⽣只能对应⼀个班级,要求能够通过班级名,⽐如1501,查出这个班级的所有学⽣,并且查出来的学⽣对象中包含班级的信息。
这种情况⽤Mysql可以很轻松实现,⼀条sql的事,但是对于mongodb来讲却很费事,⼀般有两种思路,第⼀种硬关联。先把所有学⽣都查出来,再去关联对应的班级信息。这种⽅式在数据量⼤的时候肯定是不⾏的。第⼆种⽅式就是使⽤@DBRef去关联。有些⼈可能会想,我可以把班级对象作为字段插⼊,但是这样做的话会使得每条⽂档的占⽤很⼤,mongodb对每条⽂档的⼤⼩有限制。
所以我们选⽤@DBRef去关联,这种关联会把要关联的对象变成⼀种引⽤的⽅式,去指向对象,这样mongodb存储每条⽂档的时候的占⽤就不会太⼤。
接下来我们⽤代码演⽰:
学⽣类:
@NoArgsConstructor
@AllArgsConstructor
@Data
@Document("student")
public class Student implements Serializable {
private String stuName;
private int stuAge;
private String stuSex;
@DBRef
private Clazz clazz;
}
班级类:
@NoArgsConstructor
@AllArgsConstructor
@Data
@Document("class")
public class Clazz {
@Id
private String id;
private String className;
}
把学⽣数据和班级数据插⼊mongodb,要注意,必须先插⼊班级信息,不然插⼊学⽣数据时候没法引⽤。
注⼊MongoTemplate,就可以使⽤了
@Resource
private MongoTemplate mongoTemplate;
插⼊班级数据
ArrayList<Clazz> clazzes = new ArrayList<>();
Clazz clazz1 = new ().toString(),"1501");
Clazz clazz2 = new ().toString(),"1502");
Clazz clazz3 = new ().toString(),"1503");
clazzes.add(clazz1);
clazzes.add(clazz2);
clazzes.add(clazz3);
mongoTemplate.insertAll(clazzes);
班级的id是我们⾃⼰定义的,没有使⽤mongodb⾃动⽣成的,这是因为班级的id要作为引⽤和student关联,班级实体类中就必须要有id字段,不然就会报错。id的⽣成⽅式,我们和mongodb
默认的⽅式⼀样。下⾯就是班级数据插⼊mongodb中的效果。
接下来我们插⼊学⽣数据,同时注⼊班级引⽤。
核⼼就是在引⽤的字段上加@DBRef注解。
Student stu1 = new Student("⼩刚",15,"男");
Student stu2 = new Student("⼩明",12,"男");
Student stu3 = new Student("⼩胖",18,"⼥");
Student stu4 = new Student("⼩欢",13,"男");
Student stu5 = new Student("⼩美",15,"⼥");
Student stu6 = new Student("⼩⽅",16,"⼥");
Clazz class1 = mongoTemplate.findOne(new Query(Criteria.where("className").is("1501")), Clazz.class);
Clazz class2 = mongoTemplate.findOne(new Query(Criteria.where("className").is("1502")), Clazz.class);
stu1.setClazz(class1);
stu2.setClazz(class1);
stu3.setClazz(class2);
stu4.setClazz(class1);
stu5.setClazz(class2);
stu6.setClazz(class2);
ArrayList<Student> students = new ArrayList<>();
students.add(stu1);
students.add(stu2);
students.add(stu3);
students.add(stu4);
students.add(stu5);
students.add(stu6);
mongoTemplate.insertAll(students);
这⾥可以看到,我们先通过班级名称查询出来班级,然后直接注⼊到了学⽣类中。
然后保存到mongodb中的样⼦是这样的,
可以看出,班级信息是以DBRef⽅式引⽤的,所以占⽤不⼤。
接下来我们查询,查询出1501班的所有学⽣。
Clazz clazz = mongoTemplate.findOne(new Query(Criteria.where("className").is("1501")), Clazz.cl
ass);
List<Student> stuList = mongoTemplate.find(new Query(Criteria.where("clazz.$id").is(new Id()))), Student.class);
return Result.success(stuList,"查询成功",200);
我们先把1501班查出来,然后再通过班级对象的id来查询出所有的学⽣。
这⾥要注意 "clazz.$id" 要⽤实体类中的字段,不能⽤mongo表中的字段,id字段要加$。后⾯的条件id要包装成ObjectId格式,因为mongodb中的_id就只能是ObjectId格式。
这样我们就能查出结果了,班级信息同时也查出来了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论