Docs Menu
Docs Home
/ / /
루비 드라이버
/ /

커서에서 데이터 액세스

이 가이드 에서는 Ruby 운전자 사용하여 커서 에서 데이터 액세스 방법을 학습 수 있습니다.

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

애플리케이션 코드에서 직접 Mongo::Cursor 클래스 액세스 할 수 없습니다. Ruby 운전자 사용하여 읽기 작업을 수행하는 경우 운전자 쿼리 나타내는 Mongo::Collection::View 객체 반환합니다. Collection::View 객체 에서 쿼리 결과를 요청 운전자 내부적으로 이러한 결과를 Cursor 객체 에 저장합니다. 그런 다음 Collection::ViewCursor 클래스로 지원되는 Enumerable 인터페이스를 노출하며, 이 인터페이스에서 결과에 액세스 할 수 있습니다.

이 가이드 의 예제에서는 Atlas 샘플 데이터 세트sample_restaurants 데이터베이스 에 있는 restaurants 컬렉션 사용합니다. Ruby 애플리케이션 에서 이 컬렉션 에 액세스 하려면 Atlas cluster 에 연결하는 Mongo::Client 객체 만들고 databasecollection 변수에 다음 값을 할당합니다.

database = client.use('sample_restaurants')
collection = database[:restaurants]

무료 MongoDB Atlas cluster 를 생성하고 샘플 데이터 세트를 로드하는 방법을 학습 보려면 Atlas 시작하기 가이드 를 참조하세요.

커서 의 내용을 반복하려면 읽기 작업에서 반환된 Mongo::Collection::View 객체 에서 each 메서드를 호출합니다. 이는 운전자 에 작업을 수행하고 Mongo::Cursor에 저장된 각 결과를 반환하도록 지시합니다.

다음 예시 에서는 find 메서드를 사용하여 name 필드 값이 "Dunkin' Donuts"인 모든 문서를 조회 . 그런 다음 커서 에 저장된 각 문서 인쇄합니다.

cursor = collection.find(name: "Dunkin' Donuts")
cursor.each do |doc|
puts doc
end
{"_id"=>BSON::ObjectId('...'), ..., "name"=>"Dunkin' Donuts", "restaurant_id"=>"40363098"}
{"_id"=>BSON::ObjectId('...'), ..., "name"=>"Dunkin' Donuts", "restaurant_id"=>"40379573"}
{"_id"=>BSON::ObjectId('...'), ..., "name"=>"Dunkin' Donuts", "restaurant_id"=>"40392410"}
...

커서 에서 문서를 개별적으로 조회 하려면 읽기 작업에서 반환된 Mongo::Collection::View 객체 에서 first 메서드를 호출합니다.

다음 예시 에서는 컬렉션 에서 name 값이 "Dunkin' Donuts"인 모든 문서를 찾습니다. 그런 다음 first 메서드를 호출하여 커서 의 첫 번째 문서 인쇄합니다.

cursor = collection.find(name: "Dunkin' Donuts")
first_doc = cursor.first
puts first_doc
{"_id"=>BSON::ObjectId('...'), ..., "name"=>"Dunkin' Donuts", "restaurant_id"=>"40363098"}

경고

쿼리에서 반환되는 문서의 수와 크기가 사용 가능한 애플리케이션 메모리를 초과하면 프로그램이 충돌합니다. 큰 결과 세트가 예상되는 경우 커서에 반복적으로 액세스합니다.

커서 에서 모든 문서를 조회 하려면 해당 Mongo::Collection::View 객체 에서 to_a 메서드를 사용하여 커서 배열 로 변환합니다.

다음 예시 to_a 메서드를 호출하여 커서 결과를 배열 에 저장 .

cursor = collection.find(name: "Dunkin' Donuts")
array_results = cursor.to_a

고정 사이즈 컬렉션을 쿼리할 때는 클라이언트 커서의 결과를 모두 사용한 후에도 계속 열려 있는 tailable cursor 를 사용할 수 있습니다. tailable cursor 생성하려면 cursor_type 옵션을 find 메서드에 전달합니다. 이 옵션을 :tailable로 설정합니다.

예시 들어 다음 코드와 같이 vegetables 이라는 고정 사이즈 컬렉션 만들 수 있습니다.

db = client.use('db')
collection = db[:vegetables, capped: true, size: 1024 * 1024]
collection.create
vegetables = [
{ name: 'cauliflower' },
{ name: 'zucchini' }
]
collection.insert_many(vegetables)

그런 다음 다음 코드를 사용하여 vegetables 컬렉션 의 모든 문서를 조회 하고 결과를 tailable cursor) 에 저장 . 커서 모두 소진되면 세 개의 문서를 검색할 때까지 커서가 열린 상태로 유지됩니다.

cursor = collection.find({}, cursor_type: :tailable)
docs_found = 0
cursor.each do |doc|
puts doc
docs_found += 1
break if docs_found >= 3
end
{"_id"=>BSON::ObjectId('...'), "name"=>"cauliflower"}
{"_id"=>BSON::ObjectId('...'), "name"=>"zucchini"}

vegetables 컬렉션 에 다른 문서 삽입하면 앞의 코드는 새 문서 인쇄하고 커서 에서 더 많은 결과를 조회 하지 않습니다.

테일 커서(tailable cursor)에 학습 보려면 MongoDB Server 매뉴얼에서 테일 커서 (tailable cursor)를 참조하세요.

이 가이드 에서 설명하는 함수에 대해 자세히 학습 다음 API 문서를 참조하세요.

돌아가기

문서 수 계산

이 페이지의 내용