mongodb数据库
集合mongod: 服务器
文档(嵌套子文档
文档大小不超过 16M
GridFS:超过 16M,使用网格文件系统,多个 255KB 的块存储
字段(没有范式约束)
mongo:客户端 shell 工具
mongofiles:操作 `GridFS` 工具
Spring Data MongoDB 中使用 `@DBRef` 注解关联其他文档等价与 $lookup
工程所需的依赖:
文章图片
工程目录:
文章图片
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
文章图片
我们已经把数据存进dept集合中,然后可以通过MongoDBCompass查看
文章图片
通过postman测试下staff集合(注意:dept字段必须是dept集合中存在的)
文章图片
通过MongoDBCompass查看staff集合
文章图片
可以看到dept集合和staff集合中都有数据了,说明后端没错。
关系模型
文章图片
四张表的关系模型,改成文档模型(订单与订单项合成)
文章图片
【Spring Data MongoDB 中使用 @DBRef`注解关联其他文档以及关系模型和文档模型的区别】以上就是Spring Data MongoDB 中使用 `@DBRef` 注解关联其他文档以及关系模型和文档模型的区别。有问题的小伙伴,欢迎留言!!