Scala ReactiveMon go findAndUpdate заполнитель для указанного поля c - PullRequest
1 голос
/ 13 июля 2020

Я пытаюсь использовать findAndUpdate в случае дублирования записей при попытке вставить в mongoDB, используя scala и reactiveMon go.

Первая функция получает документ и выполняет простой запрос вставки, если он не работает с кодом 11000 (код ошибки нарушения повторяющегося / уникального индекса), я вызываю для него функцию duplicateHandler, которая выглядит следующим образом:

  def duplicateHandler(item: Item): Future[Unit] = {
    collection.findAndUpdate(
      selector = Json.obj(
        "companyId" -> item.companyId,
        "documentId" -> item.docuemntId
        "status" -> "Deleted"
    ),
      update = item,
      fetchNewObject = true
    ) map { res =>
      res.result[Item] getOrElse (throw DuplicateException(Json.toJson(item.metadata).toString))
      ()
    } recover {
      case _ =>
        logger.error(s"DuplicateException for ${item.transactionId}")
        throw DuplicateException(Json.toJson(item.metadata).toString)
    }
  }

Этот код работает отлично, если прибывает существующий элемент в системе, и его статус - «Удален», он замещается новым элементом, полученным функцией.

НО, на исходном элементе есть поле, которое отмечает, когда он был удален ( поле называется 'dateDeleted'), которого нет в новом элементе, и я хотел бы, чтобы обновленный элемент содержал все новые поля + исходное поле 'удаленного' элемента.

Я хотел использовать что-то вроде:

collection.findAndUpdate(
      selector = Json.obj(
        "companyId" -> item.companyId,
        "documentId" -> item.docuemntId
        "status" -> "Deleted"
    ),
      update = item.copy(dateDeleted = $dateDeleted),
      fetchNewObject = true
    )

где $ dateDeleted будет заполнителем для поля из исходного элемента в findAndUpdate qu ery ..

Я пробовал искать такие заполнители для реактивного mon go, но ничего подобного не нашел ...

1 решение НЕ отправляет сам элемент в обновлении 'параметр findAndUpdate, но тогда мне придется просмотреть ВСЕ поля, кроме' dateDeleted ', что я не хочу здесь делать.

...