2017-02-07 7 views
0

私はこのScalaの世界では新しく、誰かが私を助けてくれたら感謝します。 したがって、MongoDB Scalaドライバを使用してファイルをmongodbデータベースに保存するScalaアプリケーションを構築しています。 以前はCasbahを使っていましたが、それはmongodbの公式ウェブサイトでレガシードライバーであり、私のプロジェクトが始まったと言われているので、私は公式ドライバーに移動することにしました。オブザーバパターンを使用してクエリの値を返す方法

私のアプリケーションはidを含むオブジェクトを保存します。このIDはMongoDBの "Sequences"というコレクションにあります。このクラスからオブジェクトを保存するたびに、シーケンスの最後のIDを取得し、それを1つインクリメントします。

私はカスバ、仕事をするために使用され、このコードを使用していました:

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のドライバで、あなたはそのための観察可能なパターンを使用する必要があり、私は少し混乱していますということです。

はこれまでのところ、私はこのようなコードを作るために管理:

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

を使用し、play frameworkを使用している場合、私はそれを自分で行う方法を発見:

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関数を使ってその戻り値を返します。次に、結果を操作することができます。

0

あなたはそこにmongoためReactiveMongo .ITの単純最高Scalaのドライバを使用する必要があります。あなただけの明確化のためにReactiveMongo play extension.

+0

こんにちは、お返事ありがとうございます。私の考えは、公式のMongoDBドライバを使用することでした。だから私はその質問に尋ねた。私はすでに別のライブラリを使って答えを持っています。 –

関連する問題