def find(query: Document, projection: Document, collectionName : MongoCollection[Document]) : Document = {
var previousDoc : Document = Document()
/*var future = collectionName.find(query).projection(projection).toFuture()*/
try {
collectionName.find(query).projection(projection).subscribe(
(data: Document) => previousDoc = data,
(error: Throwable) => println("error"),
() => println("Completed")
)
} catch {
case x:Exception => throw new MongoCustomException(x)
}
//Await.result(future, Duration.Inf)
Thread.sleep(1000)
previousDoc
}
这是我的代码片段,如果我没有使用Await或Thread,我将获得空文档。它是在从mongodb获取数据之前退出的。我想在Scala中同步运行此过程,而不使用Await和Thread方法。
答案 0 :(得分:1)
不要使用var从observable获取值。您的程序在Future完成之前停止,并且可变变量不是Mongo的任何值。将Observable转换为Future
val r = collectionName.find(query).projection(projection).toFuture
如果在程序退出之前需要此值,则线程必须等待Await.result(r,10秒)。在您的情况下,您将代码放在一个函数中,该函数在一个线程中执行,而“previousDoc = data”不会阻止它,因此它只返回。将返回类型更改为未来[Seq [Document]] :
def find(query: Document, projection: Document, collectionName : MongoCollection[Document]) : Future[Seq[Document]] = {
collectionName.find(query).projection(projection).toFuture()
}
Scala Mongo Driver使用Observables或Futures以异步方式工作。所以试着以这种方式工作。