我正在为使用 ReactiveMongo 的 MongoDB 编写 DAO Actor。我想实现一些非常简单的 CRUD 操作,其中包括一次 upsert 多条记录的能力。由于我有一个反应式应用程序(基于 Akka 构建),因此具有幂等操作对我来说很重要,因此我需要该操作是 upsert,而不是 insert。
到目前为止,我有以下(丑陋的)代码可以做到这一点:
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)
}
是否有一种开箱即用的方法可以单独使用 reactivemongo API 一次更新许多记录?
我是 MongoDB 初学者,所以这对许多人来说可能听起来微不足道。任何帮助表示赞赏!