0

私はPlay! ReactiveMongoプラグインのフレームワーク(バージョン2.3と0.11に対応)そして、私はMongoDBのコレクションから項目を削除し、影響を受けた項目の数を返します。次のコードしている:原因ReactiveMongoのドキュメントを、コレクションのremove()メソッドによって返さWriteResultクラスは、そのエラーを示すために、このようなhasErrorwriteErrorsなどのフィールドを成功の価値に応じて成功を失敗に変換する最良の方法

/** 
    * Removes all subscribers by subscription id 
    * 
    * @param subscriptionId id of the subscription 
    * @return count of removed subscribers 
    */ 
def deleteAll(subscriptionId: String): Future[Int] = { 
     logger.debug(s"Removing all subscribers with subscription id '$subscriptionId'...") 
     val query = BSONDocument("subscriptionId" -> BSONObjectID(subscriptionId)) 
     subscribersCollection.remove(query) map { writeResult: WriteResult => 
     writeResult.n match { 
      case subscribersRemoved if subscribersRemoved > 0 => 
      logger.debug(s"Successfully removed $subscribersRemoved subscribers with subscribtion id '$subscriptionId'") 
      case _ => logger.debug(s"No subscribers with subscribtion id '$subscriptionId' were removed") 
     } 
     writeResult.n 
     } 
    } 

を持っていますデータベースクエリの実行中に発生しました。

WriteResulthasErrorフィールドに応じて、失敗から復帰するためにメソッドを強化するには、どのような方法が最適でクリーンなのですか?ここで

は荒い例である:

subscribersCollection.remove(query).??? match { 
    case Success(writeResult) if writeResult.hasErrors => Failure(new DatabaseException(writeResult.errMsg, writeResult.code) 
    case any => any 
} 

すなわち、私のメソッドは、Failureを返す必要があります。データベースクエリがエラーフィールドを持つSuccessを返しても、

ありがとうございました!私のコードをより良くするために、本当に助けていただければ幸いです。

P.S.私は多分Futuretransform()方法で

P.P.S.、Tryに私のコードのすべてを包むと考えられ、ちょうどtrueに設定hasErrorフラグに例外をスロー、私はそれがより良い方法で行うことができると信じています何らかの理由で、ReactiveMongo documentationのコードサンプルとデモでは、WriteErrorのエラーフィールドとフラグが処理されません。実際には、ドキュメントは書き込み結果が、実際のエラーを示している場合、今後は に失敗した状態

なります

言うしかし、私はすでに生産コードでこのような扱いを見てきましたアプリケーションのカップルなので、やや混乱します。このような取り扱いが過度であることを意味しますか?値リターンFuture.failed(new Exception("unexpected value"))

に基づいて、その後FutureとのflatMapを行う

+0

ReactiveMongo 0.11は現在では時代遅れです。 'WriteResult'の取り扱いは、新しいバージョンのために文書化されています:http://reactivemongo.org/releases/0.12/documentation/tutorial/write-documents.html – cchantep

+0

ありがとうございます。移行は計画中ですが、今のところ、「WriteResult.okを確認する必要はありません」ということは、WriteResultが0.11でも適用可能ですか? –

+0

致命的なMongoDBエラー/失敗があった場合、 'Future [WriteResult]'は成功しません – cchantep

答えて

2

使用flatMapFuture.failed

は、我々はいくつかの将来を返す関数を考えてみましょうint型

def httpStatus: Future[Int] = Future { 404 } 

httpStatus.flatMap { 
case 404 => //return failed future 
    Future.failed(new Exception("Bad status")) 
case value => value 
} 

コードは

になります
def deleteAll(subscriptionId: String): Future[Int] = { 
     logger.debug(s"Removing all subscribers with subscription id '$subscriptionId'...") 
     val query = BSONDocument("subscriptionId" -> BSONObjectID(subscriptionId)) 
     subscribersCollection.remove(query) flatMap { writeResult: WriteResult => 
     writeResult.n match { 
      case subscribersRemoved if subscribersRemoved > 0 => 
      logger.debug(s"Successfully removed $subscribersRemoved subscribers with subscribtion id '$subscriptionId'") 
      Future.successful(writeResult.n) 
      case status => 
      logger.debug(s"No subscribers with subscribtion id '$subscriptionId' were removed") 
      Future.failed(new Exception(s"bad status exception. status: $status")) 
     } 

     } 
    } 
関連する問題