개요
이 가이드 에서는 Ruby 운전자 사용하여 커서 에서 데이터 액세스 방법을 학습 수 있습니다.
커서 는 읽기 작업의 결과를 반복 가능한 배치로 반환하는 메커니즘입니다. 커서 는 주어진 시간에 문서의 하위 집합만 보유하므로 커서는 메모리 소비와 운전자 가 서버 에 보내는 요청 수를 모두 줄여줍니다.
애플리케이션 코드에서 직접 Mongo::Cursor
클래스 액세스 할 수 없습니다. Ruby 운전자 사용하여 읽기 작업을 수행하는 경우 운전자 쿼리 나타내는 Mongo::Collection::View
객체 반환합니다. Collection::View
객체 에서 쿼리 결과를 요청 운전자 내부적으로 이러한 결과를 Cursor
객체 에 저장합니다. 그런 다음 Collection::View
는 Cursor
클래스로 지원되는 Enumerable
인터페이스를 노출하며, 이 인터페이스에서 결과에 액세스 할 수 있습니다.
샘플 데이터
이 가이드 의 예제에서는 Atlas 샘플 데이터 세트의 sample_restaurants
데이터베이스 에 있는 restaurants
컬렉션 사용합니다. Ruby 애플리케이션 에서 이 컬렉션 에 액세스 하려면 Atlas cluster 에 연결하는 Mongo::Client
객체 만들고 database
및 collection
변수에 다음 값을 할당합니다.
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 를 사용할 수 있습니다. 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 문서
이 가이드 에서 설명하는 함수에 대해 자세히 학습 다음 API 문서를 참조하세요.