Docs Menu
Docs Home
/ / /
C++ 드라이버
/

커서에서 데이터 액세스

이 페이지의 내용

  • 개요
  • 모든 커서 문서 조회
  • 문서 개별 조회
  • 테일 커서(tailable cursor)
  • 추가 정보

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

커서 는 읽기 작업의 결과를 반복 가능한 배치로 반환하는 메커니즘입니다. 커서는 모든 문서를 한 번에 반환하는 대신 주어진 시간에 문서의 하위 집합만 보유하여 메모리 소비와 네트워크 대역폭 사용량을 모두 줄입니다.

C++ 운전자 가 find() 메서드를 사용하여 읽기 작업을 수행할 때마다 mongocxx::cursor 인스턴스 에서 일치하는 문서를 반환합니다.

이 가이드 의 예제에서는 Atlas 샘플 데이터 세트sample_restaurants 데이터베이스 에 있는 restaurants 컬렉션 을 사용합니다. C++ 애플리케이션 에서 이 컬렉션 에 액세스 하려면 Atlas cluster 에 연결하는 mongocxx::client 를 인스턴스화하고 dbcollection 변수에 다음 값을 할당합니다.

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)를 만들려면 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 설명서를 참조하세요.

돌아가기

문서 수 계산