如何使用观察者模式

时间:2017-02-07 08:47:56

标签: mongodb scala observer-pattern

我是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的解决方案。

由于

2 个答案:

答案 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函数等待它的返回。然后你可以按照自己的意愿操纵结果。

相关问题