2

ReactiveMongo を使用する MongoDB 用の DAO アクターを作成しています。非常に単純な CRUD 操作をいくつか実装したいと考えています。その中には、一度に多くのレコードをアップサートする機能があります。私はリアクティブなアプリケーション (Akka 上に構築) を持っているので、冪等のアクションを持つことが重要なので、操作は挿入ではなくアップサートにする必要があります。

これまでのところ、次の(醜い)コードがあります。

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)
      }    

reactmongo API だけを使用して、一度に多くのレコードをアップサートするすぐに使える方法はありますか?

私は MongoDB の初心者なので、これは多くの人にとって些細なことに聞こえるかもしれません。どんな助けでも大歓迎です!

4

2 に答える 2

0

ドキュメントによると、BSSONCollection.save inserts the document, or updates it if it already exists in the collection: here を参照してください。さて、ドキュメントが既に存在するかどうかをどのように決定するのか正確にはわかりません。おそらく、MongoDB の指示に基づいていると思われます...つまり、主キー/ID または一意のインデックスです。

要するに:あなたは正しい方法でやっていると思います(あなたの結果はからカウントされますLastError)。

于 2013-12-10T18:01:57.600 に答える