我正在尝试设计一种可重用的模式,以在使用Spring Data与Spring MVC时更新MongoDB文档。
该用例通常可以概括如下:
- 使用repository.save()在Mongo中创建文档
- 然后在Spring MVC可编辑表单中显示该文档的部分内容。
- 用户提交更新后的文档部分,然后保存。
如果我在第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处理文档的部分更新时,其他人都在做什么?