如何使用observer模式返回查询的值



我是这个Scala世界的新手,如果有人能帮助我,我将不胜感激。因此,我正在构建一个Scala应用程序,该应用程序使用mongodb Scala驱动程序将文件保存到mongodb数据库中。我以前使用过Casbah,但由于mongodb官方网站上说它是一个遗留驱动程序,而且我的项目刚刚开始,我决定改用官方驱动程序。

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

当我使用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")
})
}

问题是,这是我第一次使用Observer模式,我不知道如何获得修改后的文档以获得最后一个id。我在很多网站上搜索了它,但都找不到答案。在大多数情况下,我只找到了卡斯巴的解决方案。

感谢

为了澄清起见,我自己发现了如何做到这一点:

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并等待其返回。然后,您可以随心所欲地操纵结果。

您应该使用ReactiveMongo。它只是mongo的最佳scala驱动程序。如果您使用的是play framework,请使用ReactiveMongo播放扩展。

最新更新