2016-12-15 4 views
0

저는 mongodb를 처음 사용하고 있으며 문서 업데이트가 어떻게 작동하는지 이해하기 위해 고심하고 있습니다. 나는 문서 '메뉴'라고 한 내 개체에 매핑Spring Mongodb findandModify가 전체 문서를 업데이트하지 못합니다.

{ 
"someId":"id123", 
"someProperty":"property123", 
"list" : [{ 
    "innerProperty":"property423" 
}] 
} 

:

@Document(collection = "menu") 
public class Menu { 
@Id 
private String id; 
private String someid; 
private String someProperty; 
private List<SomeClass> list; 

// accessors 
} 

내가 찾아이이 문서를 업데이트하지 않습니다처럼이 문서를 업데이트하려고합니다.

@Override 
public Menu update(Menu menu) { 
    Query query = new Query(
      Criteria.where("someId").is(menu.getSomeId())); 
    Update update = Update.update("menu", menu); 
    return mongoOperations.findAndModify(query, update, 
      FindAndModifyOptions.options().returnNew(true), Menu.class); 
} 

하지만이로 변경하는 경우, 작동 :

@Override 
public Menu update(Menu menu) { 
    Query query = new Query(
      Criteria.where("someId").is(menu.getSomeId())); 
    Update update = new Update().set("someProperty", menu.getSomeProperty()) 
    .set("list", menu.getList()); 
    return mongoOperations.findAndModify(query, update, 
      FindAndModifyOptions.options().returnNew(true), Menu.class); 
} 

나는이 두 번째 방법은별로 좋아하지 않아요이 ID를 사용하여 원래의 개체를 반환으로 그것은 확실히 메뉴를 찾을 않습니다 여기서 문서의 각 요소는 개별적으로 설정됩니다. 오히려 큰 문서가 있고 오류가 발생하기 쉽습니다.

왜 첫 번째 방법이 작동하지 않습니까? 그리고 문서를 업데이트하는 더 좋은 방법은 무엇일까요?

답변

0
Update update = Update.update("menu", menu) 

는 내부적으로

new Update().set("menu", menu) 

를 호출하는 열쇠를 사용하여 업데이트를 제작하는 정적 팩토리 메소드입니다 메뉴와 그러한 특성이 없기 때문에 업데이트가 실패합니다.

+0

그렇다면 개별 속성을 설정하는 대신 전체 문서를 어떻게 업데이트 할 수 있습니까? – Rohit

+0

스프링이 그렇게 할 래퍼를 제공하지 않는다고 생각합니다. 다른 mongo 매핑 드라이버 인 Morphia가 $ each를 사용하여 모든 속성을 빈 값으로 래핑하고 모든 속성 키와 값을 업데이트의 배열로 보냅니다. – Veeram

+0

push 또는 addToSet을 시도 할 수 있는지 확인하십시오. 그럴 수도 있지만 의심 스럽네요. 업데이트 업데이트 = Update.push ("메뉴", 메뉴); – Veeram