1

コードは ReactiveMongo を使用して MongoDB にリクエストを送信し、返されますFuture[BSONDocument]が、私のコードはデータのリストを処理するため、値を取得してリストに変換する必要がありFuture[BSONDocument]ます。

ブロックせずにそれを行うにはどうすればよいですか?

アップデ:

ReactiveMongoを使用していますRawCommand

 def findLByDistance()(implicit ec: ExecutionContext) =  db.command(RawCommand(
        BSONDocument(
            "aggregate" -> collName,
            "pipeline" -> BSONArray(BSONDocument(
                "$geoNear" -> BSONDocument(
                    "near" -> BSONArray(44.72,25.365),
                    "distanceField" -> "location.distance",
                    "maxDistance" -> 0.08,
                    "uniqueDocs" -> true)))
                )))

で結果が出Future[BSONDocument]ます。いくつかの単純なクエリでは、単純な変換を可能にするデフォルトのクエリビルダーを使用しました

def findLimitedEvents()(implicit ec: ExecutionContext) =
  collection.find(BSONDocument.empty)
    .query(BSONDocument("tags" -> "lazy"))
    .options(QueryOpts().batchSize(10))
    .cursor.collect[List](10, true)

基本的に、RawCommand以前に使用したものと一致する出力タイプが必要です。

4

2 に答える 2

0

正確なユースケースについてはわかりませんが(さらにコードを表示すると役立ちます)、 fromList[Future[BSONDocument]]から oneに変換すると便利な場合Future[List[BsonDocument]]があります。onSuccessmap

val futures: List[Future[A]] = List(f1, f2, f3)
val futureOfThose: Future[List[A]] = Future.sequence(futures)
于 2014-02-15T21:14:47.287 に答える
-1

ブロックせずに未来を「取得」することはできません。Futureが完了するのを待ちたい場合は、ブロックする必要があります。

あなたができることは別のmapものです:FutureFuture

val futureDoc: Future[BSONDocument] = ...
val futureList = futureDoc map { doc => docToList(doc) }

最終的に、すべての先物を結合、マッピング、回復などして、その結果で何かが起こることを望むポイントに到達します。これは、ブロックするか、ハンドラーを確立して、最終的な結果で何かを行う場所です。

val futureThing: Future[Thing] = ...

//this next bit will be executed at some later time,
//probably on a different thread
futureThing onSuccess {
  case thing => doWhateverWith(thing)
}
于 2014-02-15T20:58:46.187 に答える