커서에서 데이터 액세스
개요
이 가이드 에서는 코틀린 동기 (Kotlin Sync) 운전자 를 사용하여 커서 에서 데이터에 액세스 하는 방법을 학습 수 있습니다.
커서 는 읽기 작업의 결과를 반복 가능한 배치로 반환하는 메커니즘입니다. 커서 는 주어진 시간에 문서의 하위 집합만 보유하므로 커서는 메모리 소비와 운전자 가 서버 에 보내는 요청 수를 모두 줄여줍니다.
코틀린 동기 (Kotlin Sync) 운전자 가 여러 문서를 반환하는 읽기 작업을 수행할 때마다 커서 에 해당 문서가 자동으로 반환됩니다.
샘플 데이터
이 가이드 의 예제에서는 Atlas 샘플 데이터 세트 의
sample_restaurants
데이터베이스 에 있는 restaurants
컬렉션 을 사용합니다. 무료 MongoDB Atlas cluster 를 생성하고 샘플 데이터 세트를 로드하는 방법을 학습 보려면 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) ...
테일 커서(tailable cursor)
고정 사이즈 고정 사이즈 컬렉션 을 쿼리할 때는 클라이언트 가 커서 의 결과를 모두 사용한 후에도 계속 열려 있는 테일 커서( tailable cursor )를 사용할 수 있습니다. 고정 사이즈 고정 사이즈 컬렉션 으로 테일 커서( tailable cursor )를 만들려면 FindIterable
객체 의 cursorType
메서드에 CursorType.TailableAwait
를 지정합니다.
다음 예시 에서는 고정 사이즈 고정 사이즈 컬렉션 에 테일 커서( tailable cursor )를 생성합니다.
val results = collection.find<Document>().cursorType(CursorType.TailableAwait)
테일 커서(tailable cursor) 및 사용법에 학습 보려면 MongoDB Server 매뉴얼의 테일 커서(tailable cursor) 가이드 를 참조하세요.
문제 해결
" 서버 에서CursorNotFound 커서 ID가 유효하지 않습니다 "
MongoDB의 커서는 아무런 작업도 수행되지 않은 상태에서 오랫동안 열려 있는 경우 서버에서 시간 초과가 발생할 수 있습니다. 이로 인해 커서를 반복하려고 할 때 CursorNotFound
예외가 발생할 수 있습니다.
API 문서
이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.