SpringData Mon go projection игнорирует и отменяет значения при сохранении - PullRequest
2 голосов
/ 09 июля 2020

Позвольте мне объяснить мою проблему с SpringData mon go, у меня объявлен следующий интерфейс, я объявил настраиваемый запрос с проекцией на игнорирование индекса, этот пример предназначен только для иллюстрации, в реальной жизни я проигнорирую куча полей.

public interface MyDomainRepo extends MongoRepository<MyDomain, String> {
    @Query(fields="{ index: 0 }")
    MyDomain findByCode(String code);
}

В моем экземпляре MongoDB MyDomain имеет следующую информацию, MyDomain(code="mycode", info=null, index=19), поэтому, когда я использую findByCode из MyDomainRepo, я получил следующую информацию MyDomain(code="mycode", info=null, index=null), пока так хорошо, потому что это ожидаемое поведение, но проблема возникает, когда ..., я решил сохранить возврат findByCode.

Например, в следующем примере я получил возврат findByCode и установите для свойства info значение myinfo, и я получил объект ниже.

MyDomain(code="mycode", info="myinfo", index=null)

Итак, я использовал save из MyDomainRepo, индекс игнорировался, как ожидалось проекцией, но когда я сохранить его обратно, с обновлением или без него, SpringData Mon go, переопределить свойство index на null, и, следовательно, моя запись в экземпляре MongoDB также переопределена, следующий экзамен Пожалуйста, это мой MongoDB JSON.

{
    "_id": "5f061f9011b7cb497d4d2708",
    "info": "myinfo",
    "_class": "io.springmongo.models.MyDomain"
}

Есть способ указать SpringData Mon go, чтобы просто игнорировали пустые поля при сохранении?

1 Ответ

1 голос
/ 15 июля 2020
  • Сохранить - это операция замены, и вы не сможете сигнализировать ей о исправлении некоторых полей. Он заменит документ тем, что вы отправляете

  • Ваш вариант - использовать расширение, предоставляемое Spring Data Repository, для определения пользовательских методов репозитория

    public interface MyDomainRepositoryCustom {
 
      void updateNonNull(MyDomain myDomain);
 
    }
   public class MyDomainRepositoryImpl implements MyDomainRepositoryCustom {
 
     private final MongoTemplate mongoTemplate;
 
     @Autowired
     public BookRepositoryImpl(MongoTemplate mongoTemplate) {
        this.mongoTemplate = mongoTemplate;
     }
 
     @Override
     public void updateNonNull(MyDomain myDomain) {
        //Populate the fileds you want to patch
        Update update = Update.update("key1", "value1")
                              .update("key2", "value2");

        // you can you Update.fromDocument(Document object, String... exclude) to
        // create you document as well but then you need to make use of `MongoConverter`  
        //to convert your domain to document. 

        // create `queryToMatchId` to mtach the id
        mongoTemplate.updateFirst(queryToMatchId, update, MyDomain.class);
     }
 
    }
    public interface MyDomainRepository extends MongoRepository<..., ...>, 
                                            MyDomainRepositoryCustom {
    }
...