Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make synchronous queries using MongoDb Scala driver

As "MongoDb Scala Driver" is the only official Scala driver now, I plan to switch from Casbah. However, MongoDb Scala Driver seems to support only Asynchronous API (at least in its documentation). Is there a way to make synchronous queries?

like image 778
Bijith Kumar Avatar asked Mar 10 '23 20:03

Bijith Kumar


1 Answers

I had the same problems some days ago when I was moving from Casbah. Apparently the official Mongodb driver uses the observer pattern. I wanted to retrieve a sequence number from a collection and I had to wait for the value to be retrieved to continue the operation. I am not sure if that's the correct way, but at least this is one way of doing it:

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;  
}

Apparently you can convert the result observer into a future and wait for its return using the Await function as I did. Then you can manipulate the result as you wish.

The database configuration is the following:

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

Hope my answer was helpful

like image 165
Israel Zinc Avatar answered Mar 12 '23 10:03

Israel Zinc