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

时间:2014-12-24 00:03:32

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

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

用例通常可以概括为:

  1. 使用repository.save()
  2. 在Mongo中创建文档
  3. 然后以Spring MVC可编辑的形式呈现该文档的部分内容。
  4. 用户提交该文档的更新部分,然后保存。
  5. 如果我在步骤3中使用repository.save()方法,我将丢失文档中未绑定到表单的任何数据。使表单负责整个文档是脆弱的,所以这似乎是MongoTemplate的findAndModify()方法派上用场。

    为了使用findAndModify()方法,我创建了支持toMap()方法的Form对象,该方法将Form对象的属性作为Map并删除了一些字段(例如class和id) )。这给我一个Map,它只包含我在Form对象中关注的字段。将对象ID和此映射传递给我的自定义存储库上的update()方法,我构建了可以传递给findAndModify()方法的Query和Update对象。

    使用这种方法,我可以轻松地将字段添加到我的对象中,并且只有在我不想从表单发布中更新字段时才会担心实例。应保留未由表单操纵的文档字段。使用Repository和MongoTemplate似乎有点令人费解,所以我想知道是否有更好的例子来处理这个问题。在使用Mongo和Spring MVC时(至少),这似乎应该是一致的模式。

    我已经创建了一个示例项目,展示了如何在GitHub上实现此模型。 Spock测试显示"更新"使用save()的文档会按预期吹掉字段和我的update()方法。

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

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

1 个答案:

答案 0 :(得分:0)

如果您正在接受用户提供的任何内容,并且只是在数据库中推送它,那么您就冒着做出危险的风险,例如更新或创建他们无法做到的数据。相反,您应首先查询Mongo以获取文档的最新版本,更改任何字段(看起来您使用的是Groovy,因此您可以遍历所有属性并在新文档上设置它们),然后保存新文件,完整的文件。

如果您正在进行小的,一致的更新(例如增加投票数等等),您可以使用MongoTemplate创建一个自定义MongoDB查询来更新几个字段。查看spring-data-mongodb docs了解详情。您还可以向使用MongoRepository的{​​{1}}添加自定义方法。