3

저는 Play Framework 2.5.0과 ReactiveMongo를 사용하여 앱을 제작하고 있으며, 대부분의 웹 언어에서 매우 쉽게 할 수있는 많은 시간을 보내고 있습니다. .Bulk insert/Insert Many with 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) 
) 
} 

는 이제 있습니다 .. Akka, ReactiveMongo에서 자신이 다이빙 찾아 시도하고 JsObjects의 서열에서 JsObjects의 스트림을 생성하는 API 플레이

은 그 때 나는 다른 접근을 시도

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

내가 스트리밍하는을 사용하지 않고하지 않을 :

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

나에게 디버그 하드 오류를 제공합니다 두 번째 해결책을 사용하십시오. 제 코드에서 이해할 수없는 것들을 갖고 싶지 않습니다.

+0

화장실을하시기 바랍니다에게 있습니다 k (예 : https://github.com/ReactiveMongo/ReactiveMongo/blob/0.11.x/driver/src/test/scala/BSONCollectionSpec.scala#L72). – cchantep

+0

여전히 같은 오류가 발생합니다. 형식이 일치하지 않습니다. 발견 : Seq [reactivemongo.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 
    } 
    } 

}