2017-02-17 59 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。猜猜我们不会再有了: –

相关问题