【问题标题】:How to make synchronous queries using MongoDb Scala driver如何使用 MongoDb Scala 驱动程序进行同步查询
【发布时间】:2017-02-17 01:38:52
【问题描述】:

由于“MongoDb Scala Driver”是现在唯一的官方 Scala 驱动程序,我打算从 Casbah 切换。但是,MongoDb Scala Driver 似乎只支持异步 API(至少在其文档中)。 有没有办法进行同步查询?

【问题讨论】:

    标签: mongodb scala driver


    【解决方案1】:

    几天前我从卡斯巴搬家时遇到了同样的问题。显然,官方的 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;  
    }
    

    显然,您可以像我一样使用 Await 函数将结果观察者转换为未来并等待其返回。然后你就可以随心所欲地操作结果了。

    数据库配置如下:

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

    希望我的回答对你有帮助

    【讨论】:

    • 谢谢@israel.zinc。感谢您的详细回复。我知道我们可以通过使用未来来做到这一点,但希望有一个更干净的同步 api。猜猜我们没有了:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 2019-03-01
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多