MongoDB и Spring Boot - лучший способ обновить документ? - PullRequest
0 голосов
/ 27 апреля 2020

В моем приложении весенней загрузки есть Java POJO:

    public class Round {

        private ObjectId _id;

        @NotEmpty
        @Getter
        @Setter
        @Accessors(fluent = true)
        @JsonProperty("userId")
        private String userId;

        @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
        @JsonDeserialize(using = LocalDateDeserializer.class)
        @JsonSerialize(using = LocalDateSerializer.class)
        @Getter
        @Setter
        @Accessors(fluent = true)
        @JsonProperty("date")
        private LocalDate date;

        @Min(value = 1, message = "Score should not be less than 1")
        @Getter
        @Setter
        @Accessors(fluent = true)
        @JsonProperty("score")
        private int score;

        // rest of fields

}

У меня есть следующее MongoRepository:

@Repository
public interface RoundRepository extends MongoRepository<Round, String> {

    List<Round> findByUserId(String userId);

    @Query("{'userId' : ?0 , '_id' : ?1}")
    Optional<Round> findByUserIdAnd_id(String userId, ObjectId _id);

}

В моем классе обслуживания у меня есть рабочий create() и я пытаюсь реализовать метод update(), который будет использоваться с сопоставлением PUT в моем контроллере:

public Round create(String userId, @Valid @NotNull @RequestBody Round round) {

    // set userId from path
    round.userId(userId);

    roundRepository.save(round);
    return round;
}

public void put(String userId, ObjectId objectId, Round updatedRound) {

    // get original round
    Optional<Round> round = roundRepository.findByUserIdAnd_id(userId, objectId);

    //todo - how to implement PUT in mongo to update to "updatedRound"?

}

Я относительно новичок в MongoDB, есть ли заданный способ? сделать это? Т.е. оставить то же самое ObjectId et c, но обновить другие поля в документе?

1 Ответ

1 голос
/ 27 апреля 2020

Примечание: следующий код не проверен, но он дает вам хорошее представление. Есть два сценария ios.

  1. Если вы не отправите идентификатор с вашим запросом, данные будут вставлены.
  2. Если вы отправите существующий идентификатор с вашим запросом , данные будут обновлены.

Аннотировать @Id private ObjectId _id; в вашем классе сущности

Контроллер

@RestController
@RequestMapping("YOUR_URL")
public class RoundController{

    @PostMapping("YOUR_URL")
    public ResponseEntity<Round> update(@Valid @RequestBody Round updateRound, BindingResult result){

        //Bindning Error handle
         if (bindingResult.hasErrors()) {
            List<String> errors = new ArrayList<>();
            for (ObjectError res : bindingResult.getFieldErrors()) {
                errors.add(res.getDefaultMessage());
            }

            throw new RuntimeError(errors.toString());
        }
        return new ResponseEntity<>(roundService.save(updateRound), HttpStatus.OK);
    }
}

Репозиторий

interface RoundRepository extends MongoRepository<Round, ObjectId> {
}

Сервис

interface RoundService {
    Round save(Round round);
}

Реализация сервиса

@Service
public RoundServiceImpl implements RoundService{
    @Autowired
    RoundRepository repository;

    @Override
    public Round save(Round round){
        repository.save(round);
    }
}

Вам не нужно на самом деле выполнить специальный запрос. Но если вам нужно сделать некоторые логи c.

@Override
public Round save(Round round){

    if(round.get_id()!=null){
        //update logic
    }else {
        // insert logic
    }

    repository.save(round);
}
...