2014-12-24 25 views
3

我试图想出了与Spring MVC的结合使用Spring数据更新时,MongoDB的文档可重复使用的模式的对象/文件。模式的更新与弹簧数据的MongoDB和Spring MVC

用例一般可以通过概括:

  1. 文档在使用蒙戈创建repository.save()该文件的
  2. 零件随后在一个Spring MVC可编辑的形式呈现。
  3. 用户提交更新该文件然后将其保存的部分。

如果我在步骤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数据文件的时候在做什么?

回答

0

如果你正在服用的任何用户提供的,只是推搡,在数据库正在运行做一些危险的如更新或者创建他们不应该能够将数据的风险。相反,您应该首先查询Mongo以获取文档的最新版本,更改任何字段(看起来您正在使用Groovy,以便可以遍历所有属性并将它们设置为新文档),然后保存新的,完整的文件。

如果您正在进行小而一致的更新(例如增加投票数等),您可以使用MongoTemplate创建一个自定义的MongoDB查询来对几个字段进行更新。查看spring-data-mongodbdocs了解更多。您还可以将自定义方法添加到使用MongoTemplateMongoRepository

+1

的想法是不采取一切用户提供和它推到数据库中。用户唯一可以提供的是表单中的数据字段。对于我的简单示例,我的表单扩展了我的模型对象,但这不是必需的。我也可以在我的toMap()方法中排除“用户提供的”字段。我在自定义存储库中创建的update()方法确实使用MongoTemplate来查询和更新,但是来自JPA/Hibernate,这看起来好像比我预期的代码多一点,我想知道是否有更好的方法,或者这只是Mongo具有更大灵活性的副作用。 – watchwithmike

+0

@watchwithmike你有能力解决这个问题吗? –

+1

@VishwasShashidhar我结束了使用,你可以在其中您可以配置为使用MongoDB中的[JHipster(https://jhipster.github.io/)应用程序找到的模式。在[创建实体页)[https://jhipster.github.io/creating_an_entity.html]提供的项目确实对实体面什么的概述,你只需要确保将其配置为使用MongoDB的,而不是的JPA。我只是使用JHipster作为参考,而不是从它开始我的整个项目。希望有所帮助。 – watchwithmike