2017-02-07 4 views
0

저는이 스칼라 세계에서 처음이에요. 누군가 나를 도울 수 있다면 감사 할 것입니다. 그래서 MongoDB 스칼라 드라이버를 사용하여 파일을 mongodb 데이터베이스에 저장하는 스칼라 응용 프로그램을 빌드하고 있습니다. 이전에 Casbah를 사용했지만 mongodb 공식 웹 사이트에서 레거시 드라이버이며 프로젝트가 막 시작되었으므로 공식 드라이버로 이동하기로 결정했습니다.옵저버 패턴을 사용하여 쿼리의 값을 반환하는 방법

그래서 내 응용 프로그램은 ID가 들어있는 Object를 저장하고이 ID는 "Sequences"라는 MongoDB의 콜렉션에옵니다. 이 클래스의 객체를 저장하고 싶을 때마다, 시퀀스의 마지막 id를 먼저 가져오고 하나씩 증가시킵니다. 내가 카스바, 작업을 수행하는 데 사용이 코드를 사용하고 있었다

: 및

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를 스칼라 드라이버, 당신이 그것에 대해 관찰 패턴을 사용해야한다는 것입니다을 나는 조금 혼란 스러워요 .

지금까지,이 같은 코드를 만들어 관리 :

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") 
    }) 
} 

문제는이 옵저버 패턴을 사용하는 나의 처음 내가가 수정 된 문서를 가져 오는 방법을 모르겠입니다 마지막 이드를 가져와. 나는 그것에 관하여 많은 웹 사이트에서 수색하고 응답을 찾아 낼 수 없었다. 대부분의 경우 나는 Casbah만을위한 해결책을 발견했습니다. 당신은 거기 mongo에 대한 ReactiveMongo .IT의 단순히 최고의 스칼라 드라이버를 사용해야합니다

감사

답변

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 함수를 사용하여 반환했습니다. 그런 다음 원하는대로 결과를 조작 할 수 있습니다.

0

. 당신이 play framework을 사용하는 경우에, 단지 설명을 위해의 ReactiveMongo play extension.

+0

안녕하세요, 망각, ​​회신 해 주셔서 감사합니다. 내 생각은 공식 MongoDB 드라이버를 사용하는 것이었다. 그것이 내가 질문 한 이유입니다. 이미 다른 라이브러리를 사용하여 답변을 얻었습니다. –