Как можно обновить объект в mongoDB по проекции?

Есть класс

class A {
    private String id;
    private String field1;
    private Map<String, Set<String>> field2;
}

У него имеется проекция

class ProjectionA {
    private String id;
    private Map<String, Set<String>> field2;
}

Получаю все объекты по проекции класса А, изменяю информацию в поле field2 и хочу внести изменения в БД, как можно сохранить все объекты в БД по их проекции?


Ответы (1 шт):

Автор решения: Михаил Ребров

Мне кажется, что Вы не совсем верно реализовали идею работы с проекциями в Spring.

Проекции это конструкт, который используется в MongoDB.
ORM и ODM это инструменты, которые помогают абстрагироваться от конкретной реализации хранилища данных и проектируются таким образом, чтобы мы по-возможности вообще не думали как работает хранилище.

Сделано это для того, чтобы отделить бизнес-логику от логики работы с хранилищем.
Это совершенно разные абстрактные уровни.

И с Вашей стороны, как мне кажется, является ошибкой перенос конструктов MongoDB в бизнес логику приложения.

У Вас уже есть класс A, который описывает документ в коллекции MongoDB.
Если Вам нужно настроить получение только интересующих Вас полей документа, для этого можно использовать класса Query и просто настроить список получаемых и исключенных полей.

Query query = new Query();
query
    .fields()
    .include("id")
    .include("field2")
    .exclude("field1")
;
List<A> listOfAClassInstances = mongoTemplate.find(query, A.class);

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

Соответственно и при сохранении данных у Вас проблем в этом случае возникнуть не должно.

А в Вашем случае, насколько я понимаю, Spring будет считать что Вы просто работаете с разными коллекциями.

→ Ссылка