我正在将Spring Boot v2与mongo数据库一起使用。我想知道什么是对数据模型进行部分更新的最佳方法。假设我有一个带有x个属性的模型,根据请求,我可能只想更新其中的1个,2个或x个属性。我应该为每种类型的更新操作公开一个端点,还是可以公开一个端点品脱并以一种通用的方式进行?请注意,我将需要能够验证请求属性的内容(例如,电话号码只能是数字)
谢谢
答案 0 :(得分:1)
HTTP PATCH是通过仅指定已更改的属性来更新资源的好方法。 以下blog对其进行了很好的解释
答案 1 :(得分:0)
如果您使用的是Spring Data MongoDB,则有两个选项可以使用MongoDB Repository或使用MongoTemplate。
答案 2 :(得分:0)
您实际上只能公开一个端点。这是我几个月前的情况:
我希望人们修改Projects文档的任何(甚至所有)字段(我是谁强迫用户手动提供所有字段,大声笑)。所以我有我的模特, Project.java:
package com.foxxmg.jarvisbackend.models;
//imports
@Document(collection = "Projects")
public class Project {
@Id
public String id;
public String projectTitle;
public String projectOverview;
public Date startDate;
public Date endDate;
public List<String> assignedTo;
public String progress;
//constructors
//getters & setters
}
我有我的存储库:
ProjectRepository.java
package com.foxxmg.jarvisbackend.repositories;
//imports
@Repository
public interface ProjectRepository extends MongoRepository<Project, String>, QuerydslPredicateExecutor<Project> {
//please note, we are going to use findById(string) method for updating
Project findByid(String id);
//other abstract methods
}
现在到我的控制器ProjectController.java:
package com.foxxmg.jarvisbackend.controllers;
//import
@RestController
@RequestMapping("/projects")
@CrossOrigin("*")
public class ProjectController {
@Autowired
private ProjectRepository projectRepository;
@PutMapping("update/{id}")
public ResponseEntity<Project> update(@PathVariable("id") String id, @RequestBody Project project) {
Optional<Project> optionalProject = projectRepository.findById(id);
if (optionalProject.isPresent()) {
Project p = optionalProject.get();
if (project.getProjectTitle() != null)
p.setProjectTitle(project.getProjectTitle());
if (project.getProjectOverview() != null)
p.setProjectOverview(project.getProjectOverview());
if (project.getStartDate() != null)
p.setStartDate(project.getStartDate());
if (project.getEndDate() != null)
p.setEndDate(project.getEndDate());
if (project.getAssignedTo() != null)
p.setAssignedTo(project.getAssignedTo());
return new ResponseEntity<>(projectRepository.save(p), HttpStatus.OK);
} else
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
}
这将允许使用Spring Boot在MongoDB中进行部分更新。