Docs Menu

커서에서 데이터 액세스

이 가이드 에서는 코틀린 동기 (Kotlin Sync) 운전자 를 사용하여 커서 에서 데이터에 액세스 하는 방법을 학습 수 있습니다.

커서 는 읽기 작업의 결과를 반복 가능한 배치로 반환하는 메커니즘입니다. 커서 는 주어진 시간에 문서의 하위 집합만 보유하므로 커서는 메모리 소비와 운전자 가 서버 에 보내는 요청 수를 모두 줄여줍니다.

코틀린 동기 (Kotlin Sync) 운전자 가 여러 문서를 반환하는 읽기 작업을 수행할 때마다 커서 에 해당 문서가 자동으로 반환됩니다.

이 가이드 의 예제에서는 Atlas 샘플 데이터 세트sample_restaurants 데이터베이스 에 있는 restaurants 컬렉션 을 사용합니다. 무료 MongoDB Atlas cluster 를 생성하고 샘플 데이터 세트를 로드하는 방법을 학습 보려면 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)
...

고정 사이즈 고정 사이즈 컬렉션 을 쿼리할 때는 클라이언트 가 커서 의 결과를 모두 사용한 후에도 계속 열려 있는 테일 커서( tailable cursor )를 사용할 수 있습니다. 고정 사이즈 고정 사이즈 컬렉션 으로 테일 커서( tailable cursor )를 만들려면 FindIterable 객체 의 cursorType 메서드에 CursorType.TailableAwait 를 지정합니다.

다음 예시 에서는 고정 사이즈 고정 사이즈 컬렉션 에 테일 커서( tailable cursor )를 생성합니다.

val results = collection.find<Document>().cursorType(CursorType.TailableAwait)

테일 커서(tailable cursor) 및 사용법에 학습 보려면 MongoDB Server 매뉴얼의 테일 커서(tailable cursor) 가이드 를 참조하세요.

MongoDB의 커서는 아무런 작업도 수행되지 않은 상태에서 오랫동안 열려 있는 경우 서버에서 시간 초과가 발생할 수 있습니다. 이로 인해 커서를 반복하려고 할 때 CursorNotFound 예외가 발생할 수 있습니다.

이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.