使用Scala reactivemongo

时间:2016-05-23 18:30:36

标签: scala reactivemongo

阅读http://reactivemongo.org/releases/0.11/documentation/tutorial/consume-streams.html有这段代码

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

import play.api.libs.iteratee._
import reactivemongo.bson.BSONDocument
import reactivemongo.api.collections.bson.BSONCollection

def processPerson1(collection: BSONCollection, query: BSONDocument): Future[Unit] = {
  val enumeratorOfPeople: Enumerator[BSONDocument] =
    collection.find(query).cursor[BSONDocument].enumerate()

  val processDocuments: Iteratee[BSONDocument, Unit] =
    Iteratee.foreach { person =>
      val lastName = person.getAs[String]("lastName")
      val prettyBson = BSONDocument.pretty(person)
      println(s"found $lastName: $prettyBson")
    }

  enumeratorOfPeople.run(processDocuments)
}

运行定义为:'驱动迭代器使用枚举器的输入,在输入的末尾添加一个Input.EOF。返回结果或异常。来自https://www.playframework.com/documentation/2.5.1/api/scala/index.html#play.api.libs.iteratee.Enumerator这是否意味着如果将新文档添加到数据库中,则需要再次调用'processPerson1',以便可以运行此行enumeratorOfPeople.run(processDocuments)以便返回它。

我只想在不重新调用相同代码的情况下将文档添加到DB中。可能的“不太好”的解决方案是将enumeratorOfPeople.run(processDocuments)包装在预定的线程中但是仍然存在接收所有文档的问题,我只想返回尚未返回的文档

1 个答案:

答案 0 :(得分:0)

我使用查询创建了一个上限的mongo集合:

  

db.createCollection(" cappedCollection",{" capped":" true",   " autoIndexId":" true"," size":4096," max":10})

然后在使用find查询时使用选项:

.options(QueryOpts().tailable.awaitData) - 更多细节:Play + ReactiveMongo: capped collection and tailable cursor

将新文档添加到集合时,run方法将返回最新添加的文档。