Я пишу актер DAO для MongoDB, который использует ReactiveMongo. Я хочу реализовать некоторые очень простые CRUD-операции, среди которых возможность увеличить количество записей за один снимок. Поскольку у меня есть реактивное приложение (построенное на Akka), для меня важно иметь идемпотентные действия, поэтому мне нужно, чтобы операция была upsert, а не вставкой.Усиление многих записей с помощью ReactiveMongo и Scala
До сих пор я следующее (некрасиво) код, чтобы сделать так:
case class UpsertResult[T](nUpd: Int, nIns: Int, failed: List[T])
def upsertMany[T](l: List[T], collection: BSONCollection)
(implicit ec: ExecutionContext, w: BSONDocumentWriter[T]):
Future[UpsertResult[T]] = {
Future.sequence(l.map(o => collection.save(o).map(r => (o, r))))
.transform({
results =>
val failed: List[T] = results.filter(!_._2.ok).unzip._1
val nUpd = results.count(_._2.updatedExisting)
UpsertResult(nUpd, results.size - nUpd - failed.size, failed)
}, t => t)
}
Есть ли вне коробки способ upserting много записей одновременно используя reactivemongo API в одиночку?
Я новичок MongoDB, так что это может показаться тривиальным для многих. Любая помощь приветствуется!
Сделав некоторое исследование, я сам пришел к такому выводу. Я также прочитал, что пакетные обновления будут поддерживаться в Mongo 2.6. –
Спасибо за головы, еще не знаю о новой функции. – tmbo