フローからデータにアクセスする
Overview
このガイドでは、MongoDB Kotlin ドライバーで Flow
を使用してデータにアクセスする方法を学びます。
Flow
は、非同期に計算される値のストリームを表す Kotlin コルーチンに構築されたデータ型です。 Kotlin コルーチン ドライバーは、データベース読み取り操作の結果を表すためにフローを使用します。
このページでは、開始メソッドである を使用して、find()
FindFlow からのデータにアクセスする方法を示します。
注意
データにアクセスして保存する次の方法は、 AggregateFlow などの他のイテラブルに適用されます。
find()
メソッドはFindFlow
のインスタンスを作成して返します。 FindFlow
を使用すると、検索条件に一致するドキュメントを閲覧したり、 メソッドを通じてパラメータを設定して表示するドキュメントをさらに指定したりできます。
ターミナル メソッド
ターミナル メソッドは、操作を制御するFlow
インスタンスのすべてのパラメータを構成した後に、MongoDB サーバー上で操作を実行します。
最初のドキュメントの検索
クエリ結果の最初のドキュメントを取得するにはfirstOrNull()
メソッドを使用します。結果がない場合はnull
を使用します。
val resultsFlow = collection.find() val firstResultOrNull = resultsFlow.firstOrNull()
あるいは、 first()
メソッドを使用してクエリの最初のドキュメントを取得するか、結果がない場合はNoSuchElementException
をスローすることもできます。
try { val resultsFlow = collection.find() val firstResult = resultsFlow.first() } catch (e: NoSuchElementException) { println("No results found") }
これらのメソッドは、一意なインデックスでフィルタリングする場合など、クエリフィルターが 1 つのドキュメントと一致する場合によく使用されます。
結果の数をカウントする
クエリ 内の結果の数を取得するには、 count()
メソッドを使用します。
val resultsFlow = collection.find() val count = resultsFlow.count()
結果をリストに変換する
クエリ結果をList
に保存するには、 toList()
メソッドを使用します。
val resultsFlow = collection.find() val results = resultsFlow.toList()
この方法は、クエリフィルターが、使用可能なメモリに収まる少数のドキュメントを返す場合によく使用されます。
結果の反復処理
collect()
メソッドを使用して、取得されたドキュメントを反復処理し、早期終了が発生した場合にはフローが閉じられるようにします。
val resultsFlow = collection.find() resultsFlow.collect { println(it) }
クエリを説明する
MongoDB が操作を実行する方法に関する情報を表示するには、 explain()
メソッドを使用します。
explain()
メソッドは実行プランとパフォーマンス統計を返します。 実行プランは、MongoDB が操作を完了できる潜在的な方法です。 explain()
メソッドは、当選プラン(MongoDB が実行されたプラン)と拒否されたプランの両方を提供します。
explain()
メソッドに冗長レベルを渡すことで、説明の詳細度を指定できます。
次のテーブルには、説明のすべての冗長レベルとそのユースケースが示されています。
冗長レベル | ユースケース |
---|---|
ALL_PLANS_EXECUTIONS | MongoDB でクエリを実行するのにどのプランを選んだらよいかを知りたい場合。 |
EXECUTION_STATS | クエリがうまく機能しているかどうかを知りたい場合。 |
QUERY_PLANNER | クエリに問題があり、問題を診断するためにできるだけ多くの情報が必要です。 |
次の例では、実行プランを生成する集計ステージの勝利プランの JSON 表現を出力します。
val explanation = collection.find().explain(ExplainVerbosity.EXECUTION_STATS) val jsonSummary = explanation.getEmbedded( listOf("queryPlanner", "winningPlan"), Document::class.java ).toJson() println(jsonSummary)
{ "stage": "COLLSCAN", "direction": "forward" }
explain 操作の詳細については、次のサーバー マニュアル エントリを参照してください。
このセクションで説明されるメソッドとクラスの詳細については、次の API ドキュメントを参照してください。