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

 mongodb数据库

集合

文档(嵌套子文档

    文档大小不超过 16M

     GridFS:超过 16M,使用网格文件系统,多个 255KB 的块存储

字段(没有范式约束)


mongod: 服务器

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<Skill> 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<Skill> getSkills() {
		return skills;
	}

	public void setSkills(List<Skill> 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<Staff, String> {

}

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<Dept, String> {

}

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<Staff> 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<Dept> 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=admin


spring.data.mongodb.username=hr
spring.data.mongodb.password=hr

logging.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` 注解关联其他文档以及关系模型和文档模型的区别。有问题的小伙伴,欢迎留言!!

发布了139 篇原创文章 · 获赞 406 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_44364444/article/details/105711760