2016-08-17 2 views
1

Когда вы сохраняете документ с помощью mongoTemplate.save(), он уничтожает все немаркированные поля в документе базы данных.Spring Data mongoTemplate.save() поведение

Например, у вас есть коллекция "myDocument" с документом в MongoDB:

{ 
    "_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 приемлемым обходным решением? Любые другие идеи будут очень оценены.

Спасибо.

обновление

Как отметил @helmy это как mongoTemplate.save() работает и использование методов обновления является предпочтительным. Но в этом случае я теряю события жизненного цикла, которые встроены в структуру отображения mongodb. Например, проверка не работает на обновление, как это вызвано слушателем в OnBeforeSave случае ...

+0

«... когда несколько разных приложений используют одну и ту же базу данных». - Я бы сказал, что это фундаментальная архитектурная проблема. –

+0

@OliverGierke Да, но это обычная ситуация. К сожалению, это не идеальный мир :) – Savash

ответ

2

Это не является неожиданным или удивительного в том, что, как save() работы - это перезаписывает весь документ.

Я предлагаю вам ознакомиться с классом Spring Update для выполнения ваших обновлений.

+1

Это неожиданно, по крайней мере, для меня, поскольку другие структуры не имеют такого поведения. Например, Doctrine не будет переопределять немаркированные поля, и это выглядит разумно для меня, потому что, если поле не отображается, оно дает ключ к тому, что я не хочу управлять им. В любом случае обновление документа не включается разработчиками Spring в жизненный цикл документа и, таким образом, не генерирует события жизненного цикла. Это приносит много неудобств. Вы можете что-то предложить? ... – Savash

+0

Для меня это тоже очень неожиданно. Я исхожу из Ruby и MongoID под Ruby, не удаляет неотображаемые поля. Я имею в виду распространять! Шутки в сторону? Это абсолютно дерьмовое поведение! И что это за МонгоТемплит? Зачем мне это нужно? В Ruby жизнь намного проще, но теперь мне приходится иметь дело с этой ерундой: - (Я ценю любую помощь. –

Смежные вопросы