2016-12-15 3 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 
} 

, когда я пытаюсь найти и обновить этот документ, как это он не обновляет документ. Он уверен, что не найдет в меню, как она возвращает исходный объект с Id:

@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); 
} 

мне не очень нравится этот второй метод где каждый элемент документа настроен индивидуально, так как вы можете себе представить, что у меня довольно большой документ и он подвержен ошибкам.

Почему первый метод не работает? И что может быть лучшим подходом к обновлению документа?

ответ

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

просто статический фабричный метод для создания обновления с помощью прилагаемого ключа, который внутренне вызывает

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

и потому, что нет такого свойства, как меню терпит неудачу обновления.

+0

В таком случае, как я могу затем обновить весь документ, а не устанавливать индивидуальное свойство? – Rohit

+0

Я не думаю, что весна предоставляет любую оболочку для этого. Я знаю, что Morphia, другой драйвер сопоставления mongo, переносит все свойства со значениями компонента, используя $ each, и отправляет весь ключ свойства & значение как массив в обновлении. – Veeram

+0

Посмотрите, можете ли вы попробовать push или addToSet. Это может сработать, но я сомневаюсь. Обновить обновление = Update.push («меню», меню); – Veeram