我正在使用 Play Framework 2.5.0 和 ReactiveMongo 构建一个应用程序,我花了很多时间,卡住了,在大多数网络语言中很容易做到的事情上。
那是一次插入许多文档。为此,我必须使用 ReactiveMongo 函数bulkInsert
。
我发现这个 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 网站的示例
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 并使用第二种解决方案,因为我不喜欢在我的代码中包含我不理解的东西..