カーソルからデータにアクセスする
Overview
このガイドでは、MongoDB Java ドライバーでカーソルを使用してデータにアクセスする方法を学習します。
カーソルは、アプリケーションがデータベースの結果を反復処理しながら、特定の時点でメモリ内に結果のサブセットのみを保持できるようにするメカニズムです。 ドライバーは、複数のドキュメントに一致する読み取り操作でカーソルを使用して、一致したドキュメントを一度に返すのではなくバッチで返します。
このページでは、開始メソッドであるfind()
を使用して、FindIterable からのデータにアクセスする方法を示します。
注意
データにアクセスして保存する次の方法は、 AggregateIterable などの他のイテラブルに適用されます。
find()
メソッドはFindIterable
のインスタンスを作成して返します。 FindIterable
を使用すると、検索条件に一致するドキュメントを閲覧したり、 メソッドを通じてパラメータを設定して表示するドキュメントをさらに指定したりできます。
ターミナル メソッド
ターミナル メソッドは、操作を制御するIterable
インスタンスのすべてのパラメータを構成した後に、MongoDB 配置で操作を実行します。
最初に
クエリ結果の最初のドキュメントを取得するには、 first()
メソッドを使用します。
FindIterable<Document> iterable = collection.find(); System.out.println(iterable.first());
このメソッドは、一意なインデックスでフィルタリングする場合など、クエリフィルターが 1 つのドキュメントと一致する場合によく使用されます。
結果の数
ブロックせずにローカルに存在する結果の数を取得するには、 available()
メソッドを使用します。
MongoCursor<Document> cursor = collection.find().cursor(); System.out.println(cursor.available());
このメソッドは、アプリケーションがカーソル内のすべてのドキュメントをすでに反復処理している場合、またはカーソルが閉じている場合は0
を返します。
into
クエリ結果をList
に保存するには、 into()
メソッドを使用します。
List<Document> results = new ArrayList<>(); FindIterable<Document> iterable = collection.find(); iterable.into(results); System.out.println(results);
この方法は、クエリフィルターが、使用可能なメモリに収まる少数のドキュメントを返す場合によく使用されます。
Cursor
cursor()
メソッドを使用して、取得されたドキュメントを反復処理し、早期終了が発生した場合にはカーソルが閉じられるようにします。
MongoCursor<Document> cursor = collection.find().cursor();
カーソルが閉じられるようにする方法の詳細については、「カーソルのクリーンアップ 」セクションを参照してください。
explain
MongoDB が操作を実行する方法に関する情報を表示するには、 explain()
メソッドを使用します。
explain()
メソッドは実行プランとパフォーマンス統計を返します。 実行プランは、MongoDB が操作を完了できる潜在的な方法です。 explain()
メソッドは、当選プラン(MongoDB が実行されたプラン)と拒否されたプランの両方を提供します。
explain()
メソッドに冗長レベルを渡すことで、説明の詳細度を指定できます。
次のテーブルには、説明のすべての冗長レベルとそのユースケースが示されています。
冗長レベル | ユースケース |
---|---|
ALL_PLANS_EXECUTIONS | MongoDB でクエリを実行するのにどのプランを選んだらよいかを知りたい場合。 |
EXECUTION_STATS | クエリがうまく機能しているかどうかを知りたい場合。 |
QUERY_PLANNER | クエリに問題があり、問題を診断するためにできるだけ多くの情報が必要です。 |
次の例では、実行プランを生成する集計ステージの勝利プランの JSON 表現を出力します。
Document explanation = collection.find().explain(ExplainVerbosity.EXECUTION_STATS); List<String> keys = Arrays.asList("queryPlanner", "winningPlan"); System.out.println(explanation.getEmbedded(keys, Document.class).toJson());
上記のコード スニペットでは、次の出力が生成されます。
{ "stage": "COLLSCAN", "direction": "forward" }
explain 操作の詳細については、次のサーバー マニュアル エントリを参照してください。
このセクションで説明されるメソッドとクラスの詳細については、次の API ドキュメントを参照してください。
使用パターン
MongoCursor
とFindIterable
を使用すると、一度に 1 ドキュメントずつクエリ結果にアクセスできるため、ネットワークとキャッシュ ロジックが抽象化されます。
関数の反復
FindIterable
のforEach()
メソッドに関数を渡して、関数スタイルの結果を反復処理します。
FindIterable<Document> iterable = collection.find(); iterable.forEach(doc -> System.out.println(doc.toJson()));
重要
開始メソッドはIterable
インターフェースを実装するオブジェクトを返します。これにより、イテレータ メソッドを使用して反復処理が可能になります。 場合によっては、各ループの強化を使用して結果を反復処理します。
for (Document cur : collection.find()) { ... }
この方法の反復処理は推奨されません。ループが完了する前に例外が発生するとカーソルが閉じないためです。 MongoCursor
を使用すると、カーソルのクリーンアップ セクション に示されているように、カーソルが確実に閉じられるようにします。
条件付き反復
hasNext()
メソッドを使用してカーソルで使用可能なドキュメントがあるかどうかを確認し、 next()
メソッドを使用してカーソルから次の使用可能なドキュメントを取得します。
MongoCursor<Document> cursor = collection.find().cursor(); while (cursor.hasNext()){ System.out.println(cursor.next().toJson()); }
このセクションで説明されるメソッドとクラスの詳細については、次の API ドキュメントを参照してください。
カーソルのクリーンアップ
閉じる
クライアント アプリケーションと MongoDB 配置の両方でカーソルがリソースを消費するのを解放するには、 finally
ブロックのclose()
メソッドを使用します。
MongoCursor<Document> cursor = collection.find().cursor(); try { while (cursor.hasNext()){ System.out.println(cursor.next().toJson()); } } finally { cursor.close(); }
リソース ステートメントで試す
リソースの試行 ステートメントを使用して、クライアント アプリケーションと MongoDB 配置の両方でカーソルがリソースを消費するリソースを自動的に解放します。
try(MongoCursor<Document> cursor = collection.find().cursor()) { while (cursor.hasNext()){ System.out.println(cursor.next().toJson()); } }
このセクションで説明されるメソッドとクラスの詳細については、次の API ドキュメントを参照してください。