2014-12-24 64 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