커서에서 데이터 액세스
개요
이 가이드 에서는 C 운전자 를 사용하여 커서 의 데이터에 액세스 하는 방법을 학습 수 있습니다.
커서 는 읽기 작업의 결과를 반복 가능한 배치로 반환하는 메커니즘입니다. 커서 는 주어진 시간에 문서의 하위 집합만 보유하므로 커서는 메모리 소비와 운전자 가 서버 에 보내는 요청 수를 모두 줄여줍니다.
C 운전자 는 여러 문서를 반환하는 읽기 작업을 수행할 때마다 자동으로 커서 에 해당 문서를 반환합니다.
샘플 데이터
이 가이드 의 예제에서는 Atlas 샘플 데이터 세트 의 sample_restaurants
데이터베이스 에 있는 restaurants
컬렉션 을 사용합니다. 무료 MongoDB Atlas cluster 를 생성하고 샘플 데이터 세트를 로드하는 방법을 학습 보려면 Atlas 시작하기 가이드 를 참조하세요.
반복적으로 커서 내용에 액세스
커서 의 내용을 반복하려면 동안 루프를 사용합니다. 다음 예시 에서는 restaurants
컬렉션 의 모든 문서를 검색하고 커서 를 반복하여 각 문서 를 인쇄합니다.
const bson_t *doc; bson_t *filter = bson_new (); mongoc_cursor_t *results = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); while (mongoc_cursor_next (results, &doc)) { char *str = bson_as_canonical_extended_json (doc, NULL); printf ("%s\n", str); bson_free (str); } mongoc_cursor_destroy (results); bson_destroy (filter);
{ "_id" : { "$oid" : "..." }, ... , "name" : "Golden Pavillion", "restaurant_id" : "40363920" } { "_id" : { "$oid" : "..." }, ... , "name" : "Morris Park Bake Shop", "restaurant_id" : "30075445" } { "_id" : { "$oid" : "..." }, ... , "name" : "Criminal Court Bldg Cafeteria", "restaurant_id" : "40364443" } { "_id" : { "$oid" : "..." }, ... , "name" : "7B Bar", "restaurant_id" : "40364518" } { "_id" : { "$oid" : "..." }, ... , "name" : "Nyac Main Dining Room", "restaurant_id" : "40364467" } ...
문서 개별 조회
mongoc_cursor_next()
함수를 호출하여 커서 에서 문서를 개별적으로 검색합니다. 이 함수는 커서 를 반복하여 bson
매개변수를 커서 의 다음 문서 로 설정합니다.
다음 예시 에서는 컬렉션 에서 name
값이 "Dunkin' Donuts"
인 모든 문서를 찾습니다. 그런 다음 mongoc_cursor_next()
함수를 호출하여 커서 의 첫 번째 문서 를 인쇄합니다.
const bson_t *doc; bson_t *filter = BCON_NEW ("name", BCON_UTF8 ("Dunkin' Donuts")); mongoc_cursor_t *results = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); mongoc_cursor_next (results, &doc); char *str = bson_as_canonical_extended_json (doc, NULL); printf ("%s\n", str); bson_free (str); mongoc_cursor_destroy (results); bson_destroy (filter);
{ "_id" : { "$oid" : "..." }, ... , "name" : "Dunkin' Donuts", "restaurant_id" : "40392410" }
커서 닫기
커서 를 닫고 연결된 모든 리소스를 출시하다 하려면 다음 예시 와 같이 mongoc_cursor_destroy()
함수를 호출합니다.
mongoc_cursor_destroy (cursor);
테일 커서(tailable cursor)
고정 사이즈 고정 사이즈 컬렉션 을 쿼리할 때는 클라이언트 가 커서 의 결과를 모두 사용한 후에도 계속 열려 있는 테일 커서( tailable cursor )를 사용할 수 있습니다. 고정 사이즈 고정 사이즈 컬렉션 에 테일 커서( tailable cursor )를 만들려면 tailable
awaitData
찾기 작업을 수행할 때 및 옵션을 지정합니다.
다음 예시 에서는 고정 사이즈 고정 사이즈 컬렉션 에 테일 커서( tailable cursor )를 생성합니다.
collection = mongoc_client_get_collection (client, "<database>", "<capped collection>"); bson_t *filter = bson_new (); bson_t *opts = BCON_NEW ("tailable", BCON_BOOL (true), "awaitData", BCON_BOOL (true)); mongoc_cursor_t *tailable_cursor = mongoc_collection_find_with_opts(collection, filter, opts, NULL); // Perform operations with tailable cursor here mongoc_cursor_destroy (tailable_cursor); bson_destroy (filter); bson_destroy (opts);
테일 커서(tailable cursor) 및 사용법에 학습 보려면 MongoDB Server 매뉴얼의 테일 커서(tailable cursor) 가이드 를 참조하세요.
문제 해결
" 서버 에서CursorNotFound 커서 ID가 유효하지 않습니다 "
MongoDB 의 커서는 아무런 작업도 수행되지 않은 상태에서 오랫동안 열려 있는 경우 서버 에서 시간 초과가 발생할 수 있습니다. 이로 인해 커서 를 반복하려고 할 때 CursorNotFound
예외가 발생할 수 있습니다. 이 문제를 해결하려면 새 커서 를 엽니다.
API 문서
이 가이드 에서 설명하는 함수에 학습 보려면 다음 API 문서를 참조하세요.