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

3

我正在尝试设计一种可重用的模式,以在使用Spring Data与Spring MVC时更新MongoDB文档。

该用例通常可以概括如下:

  1. 使用repository.save()在Mongo中创建文档
  2. 然后在Spring MVC可编辑表单中显示该文档的部分内容。
  3. 用户提交更新后的文档部分,然后保存。

如果我在第3步中使用repository.save()方法,则会丢失未绑定到表单的文档中的任何数据。使表单负责整个文档是脆弱的,这就是似乎需要MongoTemplate的findAndModify()方法的地方。

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

使用这种方法,我可以轻松地向对象添加字段,并仅在存在不想从表单发布中更新的字段时才担心。 不受表单操作的文档字段应保留。 仍然似乎有点复杂,因为我同时使用了Repository和MongoTemplate,因此我想知道是否有更好的处理方法。 这似乎应该是在使用Mongo和Spring MVC时的一种一致模式(至少如此)。

我创建了一个演示如何在GitHub上实现此模型的示例项目。 Spock测试展示了如何使用save()“更新”文档将会按预期消除字段以及我的update()方法。

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

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

1个回答

0

如果你只是将用户提供的任何内容直接放入数据库中,那么你就有可能做一些危险的事情,比如更新或创建他们不应该能够访问的数据。相反,你应该首先查询MongoDB以获取文档的最新版本,更改任何字段(看起来你正在使用Groovy,所以你可以循环遍历所有属性并在新文档上设置它们),然后保存新的完整文档。

如果你正在进行小的、一致的更新(比如增加投票数之类的),你可以使用MongoTemplate创建自定义的MongoDB查询来更新几个字段。查看spring-data-mongodb docs 获取更多信息。你还可以向MongoRepository添加使用MongoTemplate的自定义方法。


1
这个想法是不要把用户提供的所有内容都塞进数据库。用户只能提供表单中的数据字段。对于我的简单示例,我让表单扩展了我的模型对象,但这并非必需。我也可以在我的toMap()方法中排除“用户提供”的字段。我在自定义存储库中创建的update()方法确实使用了MongoTemplate来查询和更新,但从JPA/Hibernate转过来,这似乎比我预期的要多一些代码,我想知道是否有更好的方法,或者这只是使用Mongo时灵活性更大的副作用。 - watchwithmike
@watchwithmike 你有没有机会解决这个问题? - Vishwas Shashidhar
1
@VishwasShashidhar 我最终使用了JHipster应用程序中可以找到的模式,您可以配置它来使用MongoDB。创建实体页面提供了项目在实体方面所做的概述,您只需要确保将其配置为使用MongoDB而不是JPA即可。我只是将JHipster作为参考,而不是从头开始启动整个项目。希望这有所帮助。 - watchwithmike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接