2016-08-17 5 views
1

mongoTemplate.save()를 사용하여 문서를 유지하면 데이터베이스 문서의 매핑되지 않은 모든 필드가 삭제됩니다.스프링 데이터 mongoTemplate.save() 동작

예를 들어, 당신은 MongoDB의에서 문서와 모음 "myDocument"가 :

{ 
    "_id": ObjectId("552402c3186eb112488b45ea"), 
    "field1": "value1", 
    "field2": "value2" 
} 

과 같은 도메인 객체 같습니다

:

public class MyDocument { 
    @Id 
    private String id; 
    private String field1; 

    // getter and setter 
} 

문서를 업데이트

MyDocument doc = myDocumentRepository.getById(<some_id>); 
doc.setField1("value3"); 
mongoTemplate.save(doc); 

"FIELD2"없이 컬렉션 :

{ 
    "_id": ObjectId("552402c3186eb112488b45ea"), 
    "field1": "value3" 
} 

그것은 예기치 않은 동작처럼 보이는 몇 가지 다른 응용 프로그램이 동일한 데이터베이스를 사용하는 진정한 스토퍼 수 있습니다.

MongoTemplate 메서드를 재정의 할 수 있습니까? 다른 아이디어는 매우 감사하겠습니다.

감사합니다. mongoTemplate.save()가 작동 및 업데이트 방법의 사용이 선호되는 방법

@helmy에서 언급 한 바와 같이 업데이트는

이다. 하지만이 경우에는 mongodb 매핑 프레임 워크에 내장 된 라이프 사이클 이벤트가 손실됩니다. 이 onBeforeSave 이벤트 리스너에 의해 트리거 예를 들어, 검증은 어떻게 save() 작품입니다 ... 갱신에 전혀 예상치 못한 또는 놀라운 일이 아니다

+0

"... 거의 다른 응용 프로그램이 동일한 데이터베이스를 사용하고 있습니다." 나는 그것이 근본적인 건축 문제라고 주장 할 것이다. –

+0

@OliverGierke 예,하지만 일반적인 상황입니다. 슬프게도, 완벽한 세상이 아니기 때문입니다. – Savash

답변

2

작동하지 않습니다 - 그것은 전체 문서를 덮어 씁니다.

업데이트를 수행하려면 스프링 Update 클래스를 살펴 보는 것이 좋습니다.

+1

다른 프레임 워크가 그러한 동작을하지 못하기 때문에 적어도 저에게는 기대하지 않았습니다. 예를 들어, Doctrine은 맵핑되지 않은 필드를 오버라이드하지 않을 것이고, 필드가 매핑되지 않으면 그것을 관리하고 싶지 않다는 단서를주기 때문에 Doctrine은 맵핑되지 않은 필드를 오버라이드하지 않을 것이고 그것은 나에게 합리적인 것처럼 보인다. 어쨌든, 문서 갱신은 문서 개발자주기에 문서 라이프 사이클에 포함되지 않으므로 라이프 사이클 이벤트를 발생시키지 않습니다. 불편을 많이 겪습니다. 당신은 무언가를 제안 할 수 있습니까? ... – Savash

+0

저 역시 역시 예상치 못한 것입니다. Ruby에서 MongoID를 사용하고 있습니다. Ruby에서는 맵핑되지 않은 필드를 지우지 않습니다. 나는 공통점이있다! 진심으로? 그것은 완전히 엉터리 행동입니다! 그리고이 MongoTemplate은 무엇입니까? 왜 내가 그것을 필요로합니까? Ruby에서 인생은 훨씬 쉬워졌지만 지금은이 헛소리를 다루어야합니다 .-- (나는 어떤 도움을 주셔서 감사합니다. –

관련 문제