3

私は、Play Framework 2.5.0とReactiveMongoを使用してアプリケーションを構築しています。私は、ほとんどのWeb言語では非常に簡単なことに取り組んでいます。一括挿入/挿入多くのPlay Framework、ReactiveMongoで

多くの書類を一度に挿入しています。 これを行うには、ReactiveMongo関数bulkInsertを使用する必要があります。

私はしかし、それは2013年からであり、現在の署名は私が撮ってみましたので、ここで

def bulkInsert(documents: Stream[P.Document], ordered: Boolean, writeConcern: WriteConcern)(implicit ec: ExecutionContext): Future[MultiBulkWriteResult] 

def bulkInsert[T](enumerator: Enumerator[T]) 

から

を変更し、非常に簡単な例を持っていたthis google groupを見つけましたその例を見て、列挙子をストリームに変換する方法を見つけてください(これを行う方法が見つかりませんでした):

ReactiveMongoのウェブサイトから example
val schemasDocs: Seq[JsObject] = { 
    jsonSchemas.fields.map { 
    case (field, value) => Json.obj(field -> value) 
    } 
} 
val enumerator = Enumerator.enumerate(schemasDocs) 
val schemasStream = Source.fromPublisher(Streams.enumeratorToPublisher(enumerator)) // my attempt to turn enumerator into a Stream 
val schemasInsert = { 
    getCollection("schemas").flatMap(
    _.bulkInsert(schemasStream, true) 
) 
} 

は、今私は...アッカ、ReactiveMongoで自分がダイビング見つけて試してみて、JsObjectsの配列からJsObjectsのストリームを作成するためのAPIを再生

は、その後、私は別のアプローチを試してみました

val bulkDocs = schemasDocs.map(implicitly[collection.ImplicitlyDocumentProducer](_)) 
collection.bulkInsert(ordered=true)(bulkDocs: _*) 

は私のハードデバッグにあるエラーを与える:

type mismatch; found : Seq[reactivemongo.play.json.collection.JSONCollection#ImplicitlyDocumentProducer] required: Seq[x$48.ImplicitlyDocumentProducer] 

私はむしろストリームAを使用していないだろう2番目のソリューションを使用してください。私のコードで理解できないものは好きではありません。

+0

トイレを持ってしてくださいにありk(例:https://github.com/ReactiveMongo/ReactiveMongo/blob/0.11.x/driver/src/test/scala/BSONCollectionSpec.scala#L72)。 – cchantep

+0

私はまだ同じエラーが発生します:タイプの不一致。見つかった:Seq [reactmongo.play.json.collection.JSONCollection#ImplicitlyDocumentProducer]必須:Seq [x $ 12.ImplicitlyDocumentProducer]、私は実際にそれを取得しません – Daniel

+0

あなたのコードはそれを理解するのに十分ではありません – cchantep

答えて

2

bulkInsertの処理方法が見つかりました。例

build.sbt

... 
libraryDependencies ++= Seq(
    "org.reactivemongo" %% "play2-reactivemongo" % "0.11.14" 
) 
... 

plugins.sbt

addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.12") 

CxTransactionsRepository.scala

package cx.repository 

import cx.model.CxTransactionEntity 
import play.modules.reactivemongo.ReactiveMongoApi 
import reactivemongo.play.json.collection.JSONCollection 

import scala.concurrent.{ExecutionContext, Future} 

class CxTransactionsRepository @Inject()(val reactiveMongoApi: ReactiveMongoApi)(implicit ec: ExecutionContext){ 

    private val cxTransactionsCollectionFuture: Future[JSONCollection] = reactiveMongoApi.database.map(_.collection[JSONCollection]("cxTransactions")) 

    def bulkInsert(seq: Seq[CxTransactionEntity]): Future[Int] = { 
    for { 
     transactions <- cxTransactionsCollectionFuture 
     writeResult <- transactions.bulkInsert(ordered = false)(seq.map(implicitly[transactions.ImplicitlyDocumentProducer](_)): _*) 
    } yield { 
     writeResult.n 
    } 
    } 

}