Каноническая реализация findAndDelete с использованием ReactiveMongo

Используя ReactiveMongo, каким будет канонический способ найти один документ с помощью запроса, < strong>удалить этот документ и, наконец, вернуть его. Я также использую плагин ReactiveMongo для Playframework. На данный момент я придумал следующий фрагмент:

def removeOne(query: JsObject)(implicit collection: JSONCollection): Future[Option[MyModel]] = {
  collection.remove(query, firstMatchOnly = true).map(result => result match {
    case success if result.ok => ???
    case failure => throw new RuntimeException(failure.message)
  })
}

Ключевой вопрос: а) содержит ли LastError единственный документ и б) как его можно преобразовать в класс Option из MyModel.


person Fynn    schedule 12.09.2014    source источник
comment
ReactiveMongo предоставляет .findAndRemove и .findAndUpdate в качестве операций сбора, начиная с версии 0.11.   -  person cchantep    schedule 27.04.2016


Ответы (1)


В реактивном монго нет ярлыка для «найти и удалить», как для грубых операций и т. Д., Но я думаю, вы можете сделать это, используя метод db.commands и FindAndModify следующим образом:

 val db: DefaultDB = ???
 import reactivemongo.core.commands._
 db.command(
   FindAndModify("collection",
     query = BSONDocument("something" -> "somevalue"),
     modify = Remove
   )
 ).map(maybeDoc =>
   maybeDoc.map(BSON.readDocument[SomeType])
 )

BSON.readDocument неявно берет читатель, который может анализировать SomeType, из BSON. Результатом операции, а затем map будет Future[Option[SomeType]]

person johanandren    schedule 14.09.2014