Я пытаюсь использовать 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 ', что я не хочу здесь делать.