如何 return 使用观察者模式查询的值

How to return the values of a query using the observer pattern

我是这个 Scala 世界的新手,如果有人能帮助我,我将不胜感激。 因此,我正在构建一个使用 MongoDB Scala 驱动程序将文件保存到 mongodb 数据库的 Scala 应用程序。 之前用的是Casbah,但是mongodb官网说是legacy driver,而我的项目才刚刚开始,所以决定转用官方驱动。

所以我的应用程序保存了一个包含 ID 的对象,这个 ID 来自 MongoDB 的一个名为 "Sequences" 的集合。每次我想从这个 class 中保存一个对象时,它首先会从序列中获取最后一个 ID 并将其递增 1。

当我使用 Casbah 时,这段代码用于完成这项工作:

def getSequenceId(seqName: String): Int = {
  val query = MongoDBObject("seq_id" -> seqName);
  val result = MongoFactory.SequenceCollection
                          .findAndModify(query, $inc("nextId" -> 1)) 
  val nbr = result.get("nextId");
  return nbr.toString.toDouble.toInt;
}

问题是,对于 MongoDB Scala 驱动程序,您必须为此使用 Observable 模式,我有点困惑。

到目前为止,我设法编写了这样的代码:

def getSequenceId(seqName: String): Int = {
  val query = new BsonDocument("seq_id", new BsonString(seqName))
  val resultado = NewMongo.SequenceCollection.findOneAndUpdate(query,inc("nextId",1)).collect()          
   .subscribe(new Observer[Seq[Document]] {
      override def onNext(result: Seq[Document]): Unit = println(s"UPDATED ${result(0)}")
      override def onError(e: Throwable): Unit = println(s"Failed due to $e")
      override def onComplete(): Unit = println("Completed")
  })
}

问题是我是第一次使用这种观察者模式,不知道如何获取修改后的文档来获取最后的id。我在很多网站上搜索过它,但找不到答案。在大多数情况下,我只找到了 Casbah 的解决方案。

谢谢

你应该使用ReactiveMongo .It's simply the best scala driver for mongo out there. And if you are using play framework, use the ReactiveMongo play extension.

为了清楚起见,我找到了自己的方法:

def getSequenceId(seqName: String): Int = {

  val query = new BsonDocument("seq_id", new BsonString(seqName))    
  val resultado = NewMongo.AibodSequence.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 函数将结果观察器转换为 future 并等待其 return。然后你就可以随心所欲地操纵结果了。