Spring Data MongoDB 中使用 @DBRef`注解关联其他文档以及关系模型和文档模型的区别

mongodb数据库

集合
文档(嵌套子文档
文档大小不超过 16M
GridFS:超过 16M,使用网格文件系统,多个 255KB 的块存储
字段(没有范式约束)
mongod: 服务器
mongo:客户端 shell 工具
mongofiles:操作 `GridFS` 工具
Spring Data MongoDB 中使用 `@DBRef` 注解关联其他文档等价与 $lookup
工程所需的依赖:
Spring Data MongoDB 中使用 @DBRef`注解关联其他文档以及关系模型和文档模型的区别
文章图片

工程目录:
Spring Data MongoDB 中使用 @DBRef`注解关联其他文档以及关系模型和文档模型的区别
文章图片

Staff.java
package com.newer.mongo2.entity; import java.util.List; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Transient; import org.springframework.data.mongodb.core.mapping.DBRef; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; @Document public class Staff { @Id String id; String name; // DBRef 引用了另一个文档,该字段存储引用文档的 _id(ObjectId) @Field("dept_id") @DBRef Dept dept; // 内嵌的子文档 List skills; // 瞬时属性不持久化 @Transient String phone; public Staff() { } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Dept getDept() { return dept; } public void setDept(Dept dept) { this.dept = dept; } public List getSkills() { return skills; } public void setSkills(List skills) { this.skills = skills; } @Override public String toString() { return "Staff [id=" + id + ", name=" + name + ", dept=" + dept + ", skills=" + skills + "]"; }}

Dept.java
package com.newer.mongo2.entity; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; @Document public class Dept { // 12 byte @Id String id; // @Id // ObjectId id; String title; String loc; public Dept() { } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getLoc() { return loc; } public void setLoc(String loc) { this.loc = loc; } @Override public String toString() { return "Dept [id=" + id + ", title=" + title + ", loc=" + loc + "]"; }}

Skill.java
package com.newer.mongo2.entity; public class Skill { String title; Level level; public Skill() { } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public Level getLevel() { return level; } public void setLevel(Level level) { this.level = level; } @Override public String toString() { return "Skill [title=" + title + ", level=" + level + "]"; } /** * 自定义的技术级别 * * @author wtao * */ public static enum Level { T1, T2, T3, T4 } }

StaffRepository.java
package com.newer.mongo2.repository; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.stereotype.Repository; import com.newer.mongo2.entity.Staff; @Repository public interface StaffRepository extends MongoRepository {}

DeptRepository.java
package com.newer.mongo2.repository; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.stereotype.Repository; import com.newer.mongo2.entity.Dept; @Repository public interface DeptRepository extends MongoRepository {}

MyRepository.java
package com.newer.mongo2.repository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.stereotype.Repository; import com.newer.mongo2.entity.Dept; // 自己实现 @Repository public class MyRepository { @Autowired MongoTemplate template; // MongoOperations mongoOperations; public void save(Dept dept) { template.save(dept); //template.executeQuery(query, collectionName, dch); //mongoOperations.query(domainType) } }

StaffController.java
package com.newer.mongo2.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.newer.mongo2.entity.Staff; import com.newer.mongo2.repository.StaffRepository; @RestController @RequestMapping("/staff") public class StaffController { @Autowired StaffRepository staffRepository; @PostMapping public Staff create(@RequestBody Staff staff) { return staffRepository.save(staff); } @GetMapping public List list() { return staffRepository.findAll(); } }

DeptController.java
package com.newer.mongo2.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.newer.mongo2.entity.Dept; import com.newer.mongo2.repository.DeptRepository; @RestController @RequestMapping("/dept") public class DeptController { @Autowired DeptRepository deptRepository; @PostMapping public Dept create(@RequestBody Dept dept) { return deptRepository.save(dept); } @GetMapping public List list() { return deptRepository.findAll(); } }

application.properties(确保你的MongoDB有hr库,若没有去创建,不会的可以去前一篇博客看)
#MongoDB数据源 spring.data.mongodb.host=ip spring.data.mongodb.port=27017 spring.data.mongodb.database=hr #spring.data.mongodb.authentication-database=adminspring.data.mongodb.username=hr spring.data.mongodb.password=hrlogging.level.web=debug spring.http.log-request-details=true

接下来我们可以通过postman测试下,(MongoDB会自动创建集合,前提是集合里有数据)。
dept
Spring Data MongoDB 中使用 @DBRef`注解关联其他文档以及关系模型和文档模型的区别
文章图片

我们已经把数据存进dept集合中,然后可以通过MongoDBCompass查看
Spring Data MongoDB 中使用 @DBRef`注解关联其他文档以及关系模型和文档模型的区别
文章图片

通过postman测试下staff集合(注意:dept字段必须是dept集合中存在的)
Spring Data MongoDB 中使用 @DBRef`注解关联其他文档以及关系模型和文档模型的区别
文章图片

通过MongoDBCompass查看staff集合
Spring Data MongoDB 中使用 @DBRef`注解关联其他文档以及关系模型和文档模型的区别
文章图片

可以看到dept集合和staff集合中都有数据了,说明后端没错。
关系模型
Spring Data MongoDB 中使用 @DBRef`注解关联其他文档以及关系模型和文档模型的区别
文章图片

四张表的关系模型,改成文档模型(订单与订单项合成)
Spring Data MongoDB 中使用 @DBRef`注解关联其他文档以及关系模型和文档模型的区别
文章图片

【Spring Data MongoDB 中使用 @DBRef`注解关联其他文档以及关系模型和文档模型的区别】以上就是Spring Data MongoDB 中使用 `@DBRef` 注解关联其他文档以及关系模型和文档模型的区别。有问题的小伙伴,欢迎留言!!

    推荐阅读