Как заполнить таблицу в MongoDB при вызове конечной точки? — МонгоДб, пружинный ботинок

#java #mongodb #spring-boot

Вопрос:

Я использую Spring Boot с MongoDB. Я новичок в MongoDB.

Чего я пытаюсь достичь, так это когда я получаю вызов на свою конечную точку или когда запрашивается моя конечная точка, я хотел бы создать таблицу в базе данных , которая будет иметь статус REQUESTED , примененный userID , а затем поля url version , requestedDate (заполненные при создании таблицы), completedDate (заполненные при сохранении URL-адреса в базе данных).

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

После сохранения URL-адреса в той же таблице, созданной во время запроса, у меня должно быть userId , url , version , requestedDate , completedDate и состояние как COMPLETED .

Код, который у меня есть до сих пор, это:

UserUrl.java

 public class UserUrl{  public final MongoUserId mongoUserId;  public final Optionallt;Stringgt; url;  public final long version;  public final Instant requestedDate;  public final Instant completeDate;  public final State state;      public UserUrl(MongoUserId mongoUserId,  Optionallt;Stringgt; url,  long version,  Instant requestedDate,  State state) {  this.mongoUserId = mongoUserId;  this.url = url;  this.version = version;  this.requestedDate = requestedDate;  this.state = state;  }    public static UserUrl create(MongoUserId mongoUserId){  return new UserUrl(  mongoUserId,  Optional.empty(),  0,  Instant.now(),  State.REQUESTED  );  }    public UserUrl withUrl(String url){  return new UserUrl(  this.mongoUserId,  Optional.of(url),  0,  Instant.now(),  State.COMPLETED  );  } }  

UserController.java

 @RequestMapping(value = "/trigger/url/{userId}",  method = RequestMethod.GET)  public void getUrlForUser(@PathVariable("userId") String userId) {   userUrlRepository.save(UserUrl.create(MongoUserId.of(userId)));   URL getUrl = userDataService.getUrlUser(userId);  String url = getUrl.toString();  if (url != null) {    //here I should probably do something to set withUrl method in model    return new ResponseEntitylt;gt;(url, HttpStatus.OK);  } else {  return new ResponseEntitylt;gt;(HttpStatus.NOT_FOUND);  }  }  

Я не уверен, как мне заполнить UserUrl модель, когда у меня есть URL ?

Кроме того, если я введу completedDate конструктор, то я предполагаю, что он также будет создан, но тогда какое значение я должен применить к нему?

Любые советы приветствуются 🙂

Ответ №1:

Вы должны использовать сущность , сохраненную с помощью CrudRepository , обновлять ее и сохранять снова, если это необходимо:

 @RequestMapping(value = "/trigger/url/{userId}", method = RequestMethod.GET) public void getUrlForUser(@PathVariable("userId") String userId) {   UserUrl userUrl = userUrlRepository.save(UserUrl.create(MongoUserId.of(userId)));   URL getUrl = userDataService.getUrlUser(userId);  String url = getUrl.toString();  if (url != null) {  userUrlRepository.save(userUrl.withUrl(url));  return new ResponseEntitylt;gt;(url, HttpStatus.OK);  } else {  return new ResponseEntitylt;gt;(HttpStatus.NOT_FOUND);  } }  

Редактировать

Чтобы изменить completeDate по завершении, то есть когда url свойство будет разрешено, обновите метод withUrl построителя для распространения this.requestedDate и инициализации completeDate в Instant.now() :

 public class UserUrl {   public final MongoUserId mongoUserId;  public final Optionallt;Stringgt; url;  public final long version;  public final Instant requestedDate;  public final Instant completeDate;  public final State state;    public UserUrl(MongoUserId mongoUserId,  Optionallt;Stringgt; url,  long version,  Instant requestedDate,  Instant completeDate,  State state) {  this.mongoUserId = mongoUserId;  this.url = url;  this.version = version;  this.requestedDate = requestedDate;  this.completeDate = completeDate;  this.state = state;  }   public static UserUrl create(MongoUserId mongoUserId){  return new UserUrl(  mongoUserId,  Optional.empty(),  0,  Instant.now(),  null,  State.REQUESTED  );  }   public UserUrl withUrl(String url){  return new UserUrl(  this.mongoUserId,  Optional.of(url),  0,  this.requestedDate,  Instant.now(),  State.COMPLETED  );  } }  

Комментарии:

1. Спасибо вам за ваш ответ. Но как мне установить requestDate и completeDate ? Я понимаю, когда я использую Instant.now() , что это будет при создании или обновлении. Но, в моем случае, после того, как я обновил таблицу URL-адресом, я хотел бы затем установить completeDate и оставить requestDate все как было.

2. Где completeDate заявленное? Я не вижу этого в вашей модели.

3. Он должен был быть там, но я не знал, как им пользоваться :/ Я обновил свой вопрос. Я не знал, должно ли это быть также мгновенно или что-то другое?

4. Я обновил свой ответ. Я надеюсь, что это поможет.

5. Спасибо! Это было именно то, что я искал.