2014-12-24 2 views
3

스프링 데이터를 스프링 MVC와 함께 사용할 때 MongoDB 문서를 업데이트하기위한 재사용 가능한 패턴을 찾는다.스프링 데이터 MongoDB와 스프링 MVC로 객체/문서를 업데이트하기위한 패턴

  1. 문서가 repository.save를 사용 몽고에서 생성된다()이 문서
  2. 부분이어서 스프링 MVC 편집 가능한 형태로 표시된다 :

    유스 케이스

    일반적으로 요약 될 수있다.
  3. 사용자는 문서의 업데이트 된 부분을 제출하여 저장합니다.

3 단계에서 repository.save() 메서드를 사용하면 양식에 바인딩되지 않은 문서의 모든 데이터가 손실됩니다. 전체 문서에 책임이있는 폼을 만들기가 어렵 기 때문에 MongoTemplate의 findAndModify() 메소드가 도움이 될 것 같습니다.

findAndModify() 메소드를 사용하기 위해 Form 객체의 속성을 Map으로 취하고 일부 필드 (예 : 클래스 및 ID)를 제거하는 toMap() 메소드를 지원하는 Form 객체를 만들었습니다. 이것은 나에게 Form 객체로부터 관심이있는 필드만을 포함하는 Map을 얻습니다. 객체 ID와이 맵을 사용자 지정된 리포지토리의 update() 메서드에 전달하여 findAndModify() 메서드에 전달할 수있는 Query 및 Update 객체를 작성합니다.

이 방법을 사용하면 필드를 내 개체에 쉽게 추가 할 수 있으며 폼 게시에서 업데이트하지 않으려는 필드가있는 경우 인스턴스에 대해서만 걱정할 수 있습니다. 양식에 의해 조작되지 않은 문서 필드는 유지되어야합니다. Repository와 MongoTemplate을 모두 사용하는 것은 여전히 ​​약간 복잡한 것처럼 보입니다. 그래서 이것을 처리하는 더 좋은 예제가 있는지 궁금합니다. Mongo와 Spring MVC (최소한)와 작업 할 때 이것이 일관된 패턴이어야하는 것처럼 보입니다.

GitHub에서이 모델을 얻는 방법을 보여주는 샘플 프로젝트를 만들었습니다. Spock 테스트는 save()를 사용하여 문서를 "업데이트"하면 필드가 예상대로 날아가 버리고 내 update() 메소드가 어떻게 날아가 버리는지를 보여줍니다.

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

스프링 MVC와 Spring 데이터를 사용하여 문서에 부분적인 업데이트를 처리 할 때 다른 사람이 뭐하는거야?

답변

0

사용자가 제공하는 것을 가져 가면서 데이터베이스에 저장 한 것을 가져가는 경우, 업데이트해서는 안되는 위험한 작업을 수행 할 위험이 있습니다. 대신 Mongo에게 가장 최신 버전의 문서를 가져오고 필드를 변경해야합니다 (Groovy를 사용하는 것처럼 보이기 때문에 모든 속성을 반복하여 새 문서에 설정할 수 있습니다). 그런 다음 새 문서를 저장하십시오 , 완전한 문서.

작고 일관된 업데이트 (예 : 투표 수 증가 등)를 수행하는 경우 MongoTemplate을 사용하여 사용자 정의 MongoDB 쿼리를 작성하여 몇 가지 필드를 업데이트 할 수 있습니다. 더 자세한 내용은 spring-data-mongodbdocs을 확인하십시오. MongoTemplate을 사용하는 MongoRepository에 사용자 지정 메서드를 추가 할 수도 있습니다.

+1

아이디어는 사용자가 제공하는 모든 것을 가져 가지 않고 데이터베이스에 저장하는 것입니다. 사용자가 제공 할 수있는 유일한 것은 양식의 데이터 필드입니다. 내 간단한 예제 들어, 내 양식 내 모델 개체를 확장 할 필요는 없지만. 내 toMap() 메소드에서 "user supplied"필드를 제외 할 수도 있습니다.내가 만든 사용자 정의 저장소에서 만든 update() 메서드는 MongoTemplate을 사용하여 쿼리 및 업데이트를 수행하지만 JPA/Hibernate에서 왔지만 예상보다 약간 더 많은 코드처럼 보입니다. 더 좋은 방법이 있는지 또는 이것이 단지 몽고와 더 큰 융통성을 갖는 부작용. – watchwithmike

+0

@watchwithmike 혹시이 문제를 해결할 수 있었습니까? –

+1

@VishwasShashidhar MongoDB를 사용하도록 구성 할 수있는 [JHipster] (https://jhipster.github.io/) 응용 프로그램에서 찾을 수있는 패턴을 사용하여 끝 냈습니다. [엔티티 페이지 만들기] [https://jhipster.github.io/creating_an_entity.html]는 프로젝트가 엔티티 측에서 수행하는 작업에 대한 개요를 제공하므로 대신 MongoDB를 사용하도록 구성해야합니다 JPA의 JHipster를 사용하여 프로젝트 전체를 시작하지 않고 참조로 사용했습니다. 희망이 도움이됩니다. – watchwithmike

관련 문제