spring-mvc - 使用 Spring-Data MongoDB 和 Spring MVC 更新对象/文档的模式

标签 spring-mvc spring-data spring-boot spring-data-mongodb

当结合使用 Spring Data 和 Spring MVC 时,我试图想出一个可重用的模式来更新 MongoDB 文档。

用例一般可以概括为:

  1. 使用 repository.save() 在 Mongo 中创建文档
  2. 该文档的部分内容随后以 Spring MVC 可编辑形式呈现。
  3. 用户提交该文档的更新部分,然后将其保存。

如果我在步骤 3 中使用 repository.save() 方法,我将丢失文档中未绑定(bind)到表单的所有数据。让表单负责整个文档是很脆弱的,所以这似乎是 MongoTemplate 的 findAndModify() 方法派上用场的地方。

为了使用 findAndModify() 方法,我创建了支持 toMap() 方法的 Form 对象,该方法将 Form 对象的属性作为 Map 并删除了一些字段(例如 class 和 id)。这为我提供了一个 Map,其中仅包含 Form 对象中我关心的字段。将对象 ID 和此映射传递到我的自定义存储库上的 update() 方法,我构建了可以传递到 findAndModify() 方法的查询和更新对象。

使用这种方法,我能够轻松地向我的对象添加字段,并且只担心存在我不想从表单发布中更新的字段的情况。不被表单操作的文档字段应该被保留。同时使用 Repository 和 MongoTemplate 似乎仍然有点令人费解,所以我想知道是否有更好的示例来说明如何处理这个问题。在使用 Mongo 和 Spring MVC 时,这似乎应该是一个一致的模式(至少)。

我创建了一个示例项目,展示了我如何在 GitHub 上实现此模型。 Spock 测试展示了如何使用 save() 和我的 update() 方法“更新”Document 将清除字段。

https://github.com/watchwithmike/diner-data

使用 Spring MVC 和 Spring Data 处理文档的部分更新时,其他人在做什么?

最佳答案

如果您获取用户提供的任何内容并将其推送到数据库中,您将冒着做一些危险的事情的风险,比如更新或创建他们不应该做的数据。相反,您应该首先查询 Mongo 以获取文档的最新版本,更改任何字段(看起来您正在使用 Groovy,因此您可以遍历所有属性并将它们设置在新文档上),然后保存新的, 完整的文档。

如果您要进行小的、一致的更新(例如增加投票数等),您可以使用 MongoTemplate 创建自定义 MongoDB 查询来更新一些字段.查看 spring-data-mongodb docs更多。您还可以将自定义方法添加到使用 MongoTemplateMongoRepository

关于spring-mvc - 使用 Spring-Data MongoDB 和 Spring MVC 更新对象/文档的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27629796/

相关文章:

mysql - 如何将 $(特殊字符)插入数据库

spring-boot - 从Spring Boot应用程序Kubernetes访问NFS卷挂载

java - 如何处理 UsernameNotFoundException spring security

java - Spring MVC (Java) 与 AWS Cognito 集成(用户身份验证)

hibernate - Spring表单验证验证数据库插入?

java - 让我的第一个 Spring webapp 工作

java - Spring Data JPA 通过嵌入对象属性查找

java - 如何使用 JPA 存储库在具有组合 PK 的表中插入多条记录,并且其中一条记录是自动递增的?

spring - 如何在带有tomcat的spring mvc maven应用程序中提供来自外部war文件的静态数据

java - 如何在启动时验证 Spring Data JPA 查询?