Docs Menu
Docs Home
/ / /
Java 同期
/ / /

カーソルからデータにアクセスする

項目一覧

  • Overview
  • ターミナル メソッド
  • 最初に
  • 結果の数
  • into
  • Cursor
  • explain
  • 使用パターン
  • 関数の反復
  • 条件付き反復
  • カーソルのクリーンアップ
  • 閉じる
  • リソース ステートメントで試す

このガイドでは、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を返します。

クエリ結果をListに保存するには、 into()メソッドを使用します。

List<Document> results = new ArrayList<>();
FindIterable<Document> iterable = collection.find();
iterable.into(results);
System.out.println(results);

この方法は、クエリフィルターが、使用可能なメモリに収まる少数のドキュメントを返す場合によく使用されます。

cursor()メソッドを使用して、取得されたドキュメントを反復処理し、早期終了が発生した場合にはカーソルが閉じられるようにします。

MongoCursor<Document> cursor = collection.find().cursor();

カーソルが閉じられるようにする方法の詳細については、「カーソルのクリーンアップ 」セクションを参照してください。

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 ドキュメントを参照してください。

MongoCursorFindIterableを使用すると、一度に 1 ドキュメントずつクエリ結果にアクセスできるため、ネットワークとキャッシュ ロジックが抽象化されます。

FindIterableforEach()メソッドに関数を渡して、関数スタイルの結果を反復処理します。

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 ドキュメントを参照してください。

戻る

Retrieve Data