Spring реактивный шаблон mongodb обновляет документ частично с объектами - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть некоторый класс (документ) для обновления в mongo db

Документ, хранящийся в mongo (реальный пример более сложный):

{
   "id": "5ba6b0576cba836aa43ab379",
   "firstName": "First Name",
   "lastName": "Last Name",
   "mobile": "123456789"
   ....................
   ....................
   ....................
   "address": "some address"
}

Допустим, у меня есть класс Foo свсе эти поля выше.

Я получаю извне частичный объект (Foo только с 3 значениями, все остальные значения равны нулю), например:

{
   "id": "5ba6b0576cba836aa43ab379",
   "mobile": "987654321",
   "address": "other address"
}

Я хочу обновить документ, но столько полученные поля.

Я нашел единственную возможность сделать это вручную с помощью реактивной пластины.Я ищу более «красивый» способ, не создавая вручную объект Update.Что-то вроде:

reactivemongotemplate.updateFirst(
    Query.query(Criteria.where("id").is("5ba6b0576cba836aa43ab379")), 
    partialFoo // (object of class is Foo)
)

Кто-нибудь знает какой-нибудь способ сделать это?

1 Ответ

0 голосов
/ 26 сентября 2018

Я не знаю, является ли это «самым хорошим» способом сделать это, но для остального веб-сервиса, который я начинаю, я пытался внутренне упростить методы PATCH и PUT, и я делаю это, используя Mapиспользуя библиотеку org.apache.commons.beanutils.PropertyUtils, а затем я создаю объект обновления, который я передаю ReactiveMongoTemplate, более или менее так:

Map<String, Object> changes = PropertyUtils.describe(myDto);
// ... check the fields that must be sets and other business rules ...
Update updateFields = new Update();
for(Map.Entry<String, Object> entry : changes.entrySet()){
  updateFields.set(entry.getKey(), entry.getValue());
}
reactivemongotemplate.updateFirst(query(where("id").is(myId)), updateFields, MyEntity.class)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...