我是Scala世界的新手,如果有人能帮助我,我会感激不尽。 因此,我正在构建一个使用MongoDB Scala驱动程序将文件保存到mongodb数据库的Scala应用程序。 我之前使用的是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。我在很多网站上搜索过它,我找不到答案。在大多数情况下,我只找到Casbah的解决方案。
由于
答案 0 :(得分:0)
你应该使用ReactiveMongo。它只是那里mongo
最好的scala驱动程序。如果您使用play framework
,请使用ReactiveMongo play extension.
答案 1 :(得分:0)
为了澄清,我发现自己该怎么做:
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函数等待它的返回。然后你可以按照自己的意愿操纵结果。