阅读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)
包装在预定的线程中但是仍然存在接收所有文档的问题,我只想返回尚未返回的文档
答案 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
方法将返回最新添加的文档。