Как использовать fetchNewObject с update.one ReactiveMon go? - PullRequest
0 голосов
/ 09 июля 2020

Раньше я использовал findAndUpdate и мог добавить fetchNewObject = true, чтобы я мог сделать что-то вроде этого после запроса:

.map(_.result[WhicherReport].getOrElse {
  throw new NoSuchElementException
})

, но сейчас я использую транзакцию и могу выполнить только update.one(...) и нет возможности передать его fetchNewObject, что я могу сделать?

Это мое развлечение c:

  def someUpdateFunc(collection: BSONCollection, metadata: Metadata, ids: List[String]): Future[UpdateWriteResult] = {
    collection.update.one(
      q = Json.obj("metadata" -> metadata,
        notLocked(now)),
      u =  Json.obj("$set" -> Json.obj("expenses.$[elem].paired" -> true)),
      upsert = false,
      multi = false,
      arrayFilters = Seq(BSONDocument("elem.id" -> BSONDocument( "$in" -> ids))),
      collation = None)
  }

и я хочу вернуть новый обновленный класс case, используя ReactiveMon go.

1 Ответ

0 голосов
/ 09 июля 2020

Невозможно использовать fetchNewObject с командой update , так как этот параметр не поддерживается этой командой.

Кажется, вы думаете, что findAndModify не может использоваться с транзакцией, что не так: может использоваться с транзакцией .

for {
  ds <- db.startSession()
  dt <- ds.startTransaction(None)

  coll = dt.collection(colName)
  _ <- coll.findAndUpdate(selector, james, upsert = true)
} yield ...

Если вы все еще хотите использовать update по неупомянутой причине, вам нужно будет выполнить find после, в той же транзакции.

PS .getOrElse { throw new NoSuchElementException } - это довольно неприятный запах кода, который не следует поощрять (и скорее составлять).

...