Docs Menu
Docs Home
/ / /
Kotlin Sync ドライバー
/

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

項目一覧

  • Overview
  • カーソルの内容に反復的にアクセスする
  • ドキュメントを個別に検索する
  • すべてのドキュメントを検索する
  • テール可能カーソル
  • トラブルシューティング
  • API ドキュメント

このガイドでは、 Kotlin Sync ドライバーを使用してカーソルからデータにアクセスする方法を学習できます。

カーソルは、読み取り操作の結果を反復可能なバッチで返すメカニズムです。 カーソルは一度にドキュメントのサブセットのみを保持するため、メモリ消費とドライバーがサーバーに送信するリクエスト数の両方を削減します。

Kotlin Sync ドライバーが複数のドキュメントを返す読み取り操作を実行するたびに、それらのドキュメントをカーソルで自動的に返します。

このガイドの例では、 Atlas サンプル データセットsample_restaurantsデータベース内の restaurantsコレクションを使用します。 MongoDB Atlas クラスターを無料で作成して、サンプル データセットをロードする方法については、 「 Atlas を使い始める 」ガイドを参照してください。

次の Kotlin データ クラスは、このコレクション内のドキュメントをモデル化します。

data class Restaurant(
@BsonId
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 のガイド を参照してください。

MongoDB のカーソルは、サーバー上で操作が実行されずに長時間開いていると、サーバー上でタイムアウトすることがあります。 これにより、カーソルを反復処理しようとすると、 CursorNotFoundの例外が発生する可能性があります。

このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。

戻る

個別のフィールド値の取得