我正在使用Play Framework 2.5.0和ReactiveMongo构建一个应用程序,我花了很多时间,坚持使用大多数网络语言都很容易做到的事情。
那个东西一次插入很多文件。
为此,我必须使用ReactiveMongo函数bulkInsert
。
我发现this google group有一个非常简单的例子,但它是从2013年开始,现在签名已经改变了
这
def bulkInsert[T](enumerator: Enumerator[T])
到
def bulkInsert(documents: Stream[P.Document], ordered: Boolean, writeConcern: WriteConcern)(implicit ec: ExecutionContext): Future[MultiBulkWriteResult]
所以在这里我试着采用这个例子并找到一种方法将Enumerator转换为Stream(没有找到任何方法):
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和Play API尝试从JsObjects的Seq创建一个JsObjects流..
然后我尝试了另一种方法:来自ReactiveMongo网站的example
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]
我宁愿不使用Streams并使用第二种解决方案,因为我不想在我的代码中理解我不理解的东西..
答案 0 :(得分: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
}
}
}