2017-02-17 126 views

回答

4

我前幾天從Casbah搬家時遇到同樣的問題。顯然官方的Mongodb驅動程序使用觀察者模式。我想從集合中檢索序列號,並且必須等待檢索值才能繼續操作。我不知道這是正確的做法,但至少這是做這件事的一種方法:

def getSequenceId(seqName: String): Int = { 

    val query = new BsonDocument("seq_id", new BsonString(seqName))  
    val resultado = NewMongo.SequenceCollection.findOneAndUpdate(query,inc("nextId",1))  
    resultado.subscribe(new Observer[Document] {   
    override def onNext(result: Document): Unit ={} 
    override def onError(e: Throwable): Unit ={} 
    override def onComplete(): Unit = {} 
    }) 
    val awaitedR = Await.result(resultado.toFuture, Duration.Inf).asInstanceOf[List[Document]](0) 

    val ret = awaitedR.get("nextId").getOrElse(0).asInstanceOf[BsonDouble].intValue(); 

    return ret; 
} 

顯然,你可以將結果觀察者轉換成未來,等待使用等待功能,像我一樣的回報。然後,您可以根據需要操縱結果。

數據庫配置如下:

private val mongoClient: MongoClient = MongoClient("mongodb://localhost:27017/?maxPoolSize=30") 
private val database: MongoDatabase = mongoClient.getDatabase("mydb"); 
val Sequence: MongoCollection[Document] = database.getCollection(SEQUENCE); 

希望我的回答對您有所幫助

+0

感謝@ israel.zinc。感謝您的詳細回覆。我明白我們可以通過使用未來,但希望有一個更清潔的同步api。猜猜我們不會再有了: –

相關問題