カーソルからデータにアクセスする
Overview
このガイドでは、 Kotlin Sync ドライバーを使用してカーソルからデータにアクセスする方法を学習できます。
カーソルは、読み取り操作の結果を反復可能なバッチで返すメカニズムです。 カーソルは一度にドキュメントのサブセットのみを保持するため、メモリ消費とドライバーがサーバーに送信するリクエスト数の両方を削減します。
Kotlin Sync ドライバーが複数のドキュメントを返す読み取り操作を実行するたびに、それらのドキュメントをカーソルで自動的に返します。
サンプル データ
このガイドの例では、 Atlas サンプル データセットのsample_restaurants
データベース内の restaurants
コレクションを使用します。 MongoDB Atlas クラスターを無料で作成して、サンプル データセットをロードする方法については、 「 Atlas を使い始める 」ガイドを参照してください。
次の Kotlin データ クラスは、このコレクション内のドキュメントをモデル化します。
data class Restaurant( val id: ObjectId, val name: String )
カーソルの内容に反復的にアクセスする
カーソルの内容を反復処理するには、次の例に示すようにforEach()
メソッドを使用します。
val results = collection.find() results.forEach { result -> println(result) }
あるいは、 use()
メソッドを使用してカーソルにループを実装します。
val results = collection.find() results.cursor().use { cursor -> while (cursor.hasNext()) { println(resultCursor.next()) } }
注意
デフォルトでは、クライアントがカーソル内の結果をすべて使い切ると、MongoDB はカーソルを閉じます。 このガイドの例では、 close()
メソッドを使用してカーソルを明示的に閉じている。
ドキュメントを個別に検索する
カーソルからドキュメントを個別に取得するには、 next()
メソッドを呼び出します。
次の例では、 name
の値が"Dunkin' Donuts"
である コレクション内のすべてのドキュメントを検索します。 次に、 next()
メソッドを呼び出してカーソルの最初のドキュメントを出力します。
val results = collection .find<Restaurant>(eq(Restaurant::name.name, "Dunkin' Donuts")) results.cursor().use { cursor -> println(if (cursor.hasNext()) cursor.next() else "No document matches the filter") }
Restaurant(id=5eb3d668b31de5d588f42c66, name=Dunkin' Donuts)
すべてのドキュメントを検索する
警告
クエリによって返されたドキュメントの数とサイズが利用可能なアプリケーション メモリを超えると、プログラムはクラッシュします。 大規模な結果セットが予想される場合は、カーソルに反復的にアクセスしてください。
カーソルからすべてのドキュメントを検索するには、次の例に示すように、カーソルをList
に変換します。
val results = collection.find<Restaurant>(eq(Restaurant::name.name, "Dunkin' Donuts")) val resultsList = results.toList() for (result in resultsList) { println(result) }
Restaurant(id=5eb3d668b31de5d588f42c66, name=Dunkin' Donuts) Restaurant(id=5eb3d668b31de5d588f42ca0, name=Dunkin' Donuts) Restaurant(id=5eb3d668b31de5d588f42b08, name=Dunkin' Donuts) Restaurant(id=5eb3d668b31de5d588f42cd7, name=Dunkin' Donuts) ...
テール可能カーソル
Cappedコレクションをクエリする場合、クライアントがカーソルの結果を使い果たした後も開いたままになる 追尾可能 ( tailable) カーソルを使用できます。 Cappedコレクションを使用して追尾可能 (tailable) カーソルを作成するには、 FindIterable
オブジェクトのcursorType
メソッドにCursorType.TailableAwait
を指定します。
次の例では、Cappedコレクションに 追尾可能 (tailable) カーソル を作成します。
val results = collection.find<Document>().cursorType(CursorType.TailableAwait)
追尾可能 (tailable) カーソルとその使用方法の詳細については、 マニュアルの 追尾可能 (tailable) カーソルMongoDB Server のガイド を参照してください。
トラブルシューティング
" CursorNotFound カーソル ID はサーバーで無効です "
MongoDB のカーソルは、サーバー上で操作が実行されずに長時間開いていると、サーバー上でタイムアウトすることがあります。 これにより、カーソルを反復処理しようとすると、 CursorNotFound
の例外が発生する可能性があります。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。