2016-09-08 43 views
1
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 
    } 

這是我的代碼片段,如果我沒有使用等待或線程,我會得到空文檔。在從mongodb獲取數據之前它正在退出。我想在Scala中同步運行此過程,而不使用Await和Thread方法。我想使用scala驅動程序在mongodb上執行查找操作

+0

你正在使用哪一個mongo客戶端? – Abhi

+0

你可以在你從查詢中獲得的'Observable'上調用'toFuture',然後對它進行模式匹配以得到值。 – sebszyller

+0

您可以查看http://reactivemongo.org/releases/0.11/documentation/tutorial/find-documents.html – cchantep

回答

0

不要使用var從observable中獲取值。你的程序在未來完成之前停止並且可變變量沒有來自Mongo的任何值。如果你想要這個值你的程序退出你的線程必須Await.result(R,10秒)前等待轉換到可觀察未來

val r = collectionName.find(query).projection(projection).toFuture 

。在你的情況下,你的代碼在一個線程中執行的函數中,而「previousDoc = data」不會阻塞它,因此它只是返回。改變返回類型爲未來[序號[文獻]

def find(query: Document, projection: Document, collectionName : MongoCollection[Document]) : Future[Seq[Document]] = { 
collectionName.find(query).projection(projection).toFuture()      
} 

的Scala蒙戈驅動工作在使用觀測量或期貨異步方式。所以試着以這種方式工作。

相關問題