私はPlay! ReactiveMongoプラグインのフレームワーク(バージョン2.3と0.11に対応)そして、私はMongoDBのコレクションから項目を削除し、影響を受けた項目の数を返します。次のコードしている:原因ReactiveMongoのドキュメントを、コレクションのremove()
メソッドによって返さWriteResult
クラスは、そのエラーを示すために、このようなhasError
やwriteErrors
などのフィールドを成功の価値に応じて成功を失敗に変換する最良の方法
/**
* 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
}
}
を持っていますデータベースクエリの実行中に発生しました。
WriteResult
のhasError
フィールドに応じて、失敗から復帰するためにメソッドを強化するには、どのような方法が最適でクリーンなのですか?ここで
は荒い例である:
subscribersCollection.remove(query).??? match {
case Success(writeResult) if writeResult.hasErrors => Failure(new DatabaseException(writeResult.errMsg, writeResult.code)
case any => any
}
すなわち、私のメソッドは、Failure
を返す必要があります。データベースクエリがエラーフィールドを持つSuccess
を返しても、
ありがとうございました!私のコードをより良くするために、本当に助けていただければ幸いです。
P.S.私は多分Future
のtransform()
方法で
P.P.S.、Try
に私のコードのすべてを包むと考えられ、ちょうどtrue
に設定hasError
フラグに例外をスロー、私はそれがより良い方法で行うことができると信じています何らかの理由で、ReactiveMongo documentationのコードサンプルとデモでは、WriteError
のエラーフィールドとフラグが処理されません。実際には、ドキュメントは書き込み結果が、実際のエラーを示している場合、今後は に失敗した状態
なります
言うしかし、私はすでに生産コードでこのような扱いを見てきましたアプリケーションのカップルなので、やや混乱します。このような取り扱いが過度であることを意味しますか?値リターン
Future.failed(new Exception("unexpected value"))
に基づいて、その後
Future
とのflatMap
を行う
ReactiveMongo 0.11は現在では時代遅れです。 'WriteResult'の取り扱いは、新しいバージョンのために文書化されています:http://reactivemongo.org/releases/0.12/documentation/tutorial/write-documents.html – cchantep
ありがとうございます。移行は計画中ですが、今のところ、「WriteResult.okを確認する必要はありません」ということは、WriteResultが0.11でも適用可能ですか? –
致命的なMongoDBエラー/失敗があった場合、 'Future [WriteResult]'は成功しません – cchantep