我想使用scala驱动程序在mongodb上执行查找操作

时间:2016-09-08 06:15:52

标签: scala

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方法。

1 个答案:

答案 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以异步方式工作。所以试着以这种方式工作。