커서에서 데이터 액세스
개요
이 가이드 에서는 C++ 운전자 를 사용하여 커서 에서 데이터에 액세스 하는 방법을 학습 수 있습니다.
커서 는 읽기 작업의 결과를 반복 가능한 배치로 반환하는 메커니즘입니다. 커서는 모든 문서를 한 번에 반환하는 대신 주어진 시간에 문서의 하위 집합만 보유하여 메모리 소비와 네트워크 대역폭 사용량을 모두 줄입니다.
C++ 운전자 가 find()
메서드를 사용하여 읽기 작업을 수행할 때마다 mongocxx::cursor
인스턴스 에서 일치하는 문서를 반환합니다.
샘플 데이터
이 가이드 의 예제에서는 Atlas 샘플 데이터 세트 의 sample_restaurants
데이터베이스 에 있는 restaurants
컬렉션 을 사용합니다. C++ 애플리케이션 에서 이 컬렉션 에 액세스 하려면 Atlas cluster 에 연결하는 mongocxx::client
를 인스턴스화하고 db
및 collection
변수에 다음 값을 할당합니다.
auto db = client["sample_restaurants"]; auto collection = db["restaurants"];
무료 MongoDB Atlas cluster 를 생성하고 샘플 데이터 세트를 로드하는 방법을 학습 보려면 Atlas 시작하기 가이드 를 참조하세요.
모든 커서 문서 조회
mongocxx::cursor
인스턴스 의 내용을 반복하려면 for
루프를 사용합니다.
다음 예시 에서는 find()
메서드를 사용하여 name
값이 "Dunkin' Donuts"
인 모든 문서를 조회 합니다. 그런 다음 find()
메서드에서 반환된 커서 에서 각 문서 를 인쇄합니다.
auto cursor = collection.find(make_document(kvp("name", "Dunkin' Donuts"))); for(auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; }
{ "_id" : { "$oid" : "..." }, ... "name" : "Dunkin' Donuts", "restaurant_id" : "40379573" } { "_id" : { "$oid" : "..." }, ... "name" : "Dunkin' Donuts", "restaurant_id" : "40363098" } { "_id" : { "$oid" : "..." }, ... "name" : "Dunkin' Donuts", "restaurant_id" : "40395071" } ...
문서 개별 조회
커서 에서 개별 문서 를 조회 하려면 mongocxx::cursor
인스턴스 에서 begin()
메서드를 호출합니다. 이 메서드는 커서 의 첫 번째 문서 를 가리키는 mongocxx::cursor::iterator
인스턴스 를 반환합니다.
다음 예시 에서는 컬렉션 에서 name
값이 "Dunkin' Donuts"
인 모든 문서를 찾습니다. 그런 다음 begin()
메서드를 호출하여 커서 의 첫 번째 문서 를 인쇄합니다.
auto cursor = collection.find(make_document(kvp("name", "Dunkin' Donuts"))); auto doc = cursor.begin(); std::cout << bsoncxx::to_json(*doc) << std::endl;
{ "_id" : { "$oid" : "..." }, ... "name" : "Dunkin' Donuts", "restaurant_id" : "40379573" }
테일 커서(tailable cursor)
고정 사이즈 고정 사이즈 컬렉션 을 쿼리할 때는 클라이언트 가 커서 의 결과를 모두 사용한 후에도 계속 열려 있는 테일 커서( tailable cursor )를 사용할 수 있습니다. 테일 커서( tailable cursor)를 만들려면 mongocxx::options::find
객체 를 인스턴스화하고 해당 cursor_type
필드 를 mongocxx::cursor::type::k_tailable
으)로 설정하다 합니다. 그런 다음 mongocxx::options::find
인스턴스 를 find()
메서드에 인수로 전달합니다.
예를 예시, 다음 코드와 같이 야채를 나타내는 문서를 저장하는 vegetables
이라는 고정 사이즈 컬렉션 을 만들 수 있습니다.
auto db = client["db"]; auto collection = db.create_collection("vegetables", make_document(kvp("capped", true), kvp("size", 1024 * 1024))); std::vector<bsoncxx::document::value> vegetables; vegetables.push_back(make_document(kvp("name", "cauliflower"))); vegetables.push_back(make_document(kvp("name", "zucchini"))); auto result = collection.insert_many(vegetables);
다음 코드에서는 테일 커서( tailable cursor )를 사용하여 vegetables
컬렉션 의 모든 문서를 조회 합니다. 커서 가 모두 소진되면 세 개의 문서를 검색할 때까지 커서가 열린 상태로 유지됩니다.
mongocxx::options::find opts{}; opts.cursor_type(mongocxx::cursor::type::k_tailable); auto cursor = collection.find({}, opts); int docs_found = 0; while (docs_found < 3) { for (auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; docs_found++; } // Sleeps for 100 milliseconds before trying to access more documents std::this_thread::sleep_for(std::chrono::milliseconds(100)); }
{ "_id" : { "$oid" : "..." }, "name" : "cauliflower" } { "_id" : { "$oid" : "..." }, "name" : "zucchini" }
vegetables
컬렉션 에 다른 문서 를 삽입하는 경우 앞의 코드는 새 문서 를 인쇄하고 while
루프를 닫습니다.
테일 커서(tailable cursor)에 대해 자세히 알아보려면 매뉴얼의 테일 커서(tailable cursor) 가이드 를 MongoDB Server 참조하세요.
추가 정보
읽기 작업에 학습 보려면 데이터 조회 가이드 를 참조하세요.
API 문서
이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.