3

私はplay2とreactivemongoを使ってmongodbから結果を取得しています。結果の各項目を変換して、メタデータを追加する必要があります。その後、ソートを適用する必要があります。

私が使用する変換ステップに対処するにはenumerate()

def ideasEnumerator = collection.find(query)
    .options(QueryOpts(skipN = page))
    .sort(Json.obj(sortField -> -1))
    .cursor[Idea]
    .enumerate()

次に、次のように Iteratee を作成します。

val processIdeas: Iteratee[Idea, Unit] =
  Iteratee.foreach[Idea] { idea =>
    resolveCrossLinks(idea) flatMap { idea =>
      addMetaInfo(idea.copy(history = None))
    }
  }

最後に、Iteratee にフィードします。

ideasEnumerator(processIdeas)

そして今、私は立ち往生しています。私が見たすべての例は、println内部foreachで何らかの処理を行っていますが、最終結果は気にしていないようです。

では、すべてのドキュメントが返されて変換されると、どうすればシーケンス、リスト、またはさらに処理できるその他のデータ型を取得できるのでしょうか?

4

2 に答える 2

2

Iteratee の署名をIteratee[Idea, Unit]AIteratee[Idea, Seq[A]]が型の場所に変更します。基本的に、Iteratee の最初のパラメーターは入力型で、2 番目のパラメーターは出力型です。あなたの場合、出力タイプをユニットとして指定しました。

以下のコードを見てください。コンパイルされない場合がありますが、基本的な使用法が示されています。

ideasEnumerator.run(
  Iteratee.fold(List.empty[MyObject]) { (accumulator, next) => 
    accumulator + resolveCrossLinks(next) flatMap { next => 
      addMetaInfo(next.copy(history = None))
    } 
  }
) // returns Future[List[MyObject]]

ご覧のとおり、Iteratee は単なるステート マシンです。その Iteratee 部分を抽出して、val に割り当てるだけです。

val iteratee = Iteratee.fold(List.empty[MyObject]) { (accumulator, next) => 
        accumulator + resolveCrossLinks(next) flatMap { next => 
          addMetaInfo(next.copy(history = None))
        } 
      }

Idea から List[MyObject] に変換する必要がある場合はいつでも自由に使用してください。

于 2014-07-09T17:49:23.747 に答える