튜토리얼
이 페이지의 내용
Tutorial.cpp에서이 튜토리얼의 전체 코드를 참조 하세요.
전제 조건
포트 27017 의 로컬 호스트에서 실행 mongod 인스턴스 입니다.
mongocxx 드라이버. 설치를 참조하세요.
소스 파일 상단에 다음 문구가 표시됩니다.
using bsoncxx::builder::basic::kvp; using bsoncxx::builder::basic::make_array; using bsoncxx::builder::basic::make_document;
컴파일
mongocxx 드라이버의 설치 프로세스 는 pkg-config libmongocxx.pc
와함께 사용할 파일 을 설치합니다.
프로그램을 컴파일하려면 다음 명령을 실행합니다.
c++ --std=c++11 <input>.cpp $(pkg-config --cflags --libs libmongocxx)
pkg-config를 사용할 수 없는 경우 명령줄이나 IDE에서 포함 및 라이브러리 플래그를 수동으로 설정해야 합니다. 예를 들어 libmongoc 및 mongocxx가 /usr/local
에 설치된 경우 위의 컴파일 줄이 다음과 같이 확장됩니다.
c++ --std=c++11 <input>.cpp -I/usr/local/include/mongocxx/v_noabi \ -I/usr/local/include/bsoncxx/v_noabi \ -L/usr/local/lib -lmongocxx -lbsoncxx
연결하기
중요
연결하기 전에 mongocxx:: 인스턴스 의 인스턴스 를 하나만 생성해야 합니다. . 이 인스턴스 는 프로그램 전체에 존재해야 합니다.
실행 MongoDB 인스턴스 에 연결하려면 mongocxx:: 인스턴스 를 사용합니다. 클래스.
mongocxx::uri 를 사용하여 연결할 호스팅하다 를 지정해야 합니다.MongoDB URI 가 포함된 인스턴스 를 생성하고 이를 mongocxx::client
생성자에 전달합니다. 지원되는 URI 옵션에 관한 자세한 내용은 C++ 운전자 빌드 에 사용된 libmongoc 버전 또는 최신 libmongoc 출시하다 설명서를 참조하세요.
기본 mongocxx::uri
생성자는 포트 27017
의 로컬 호스트에서 실행 중인 서버에 연결합니다.
mongocxx::instance instance{}; // This should be done only once. mongocxx::client client{mongocxx::uri{}};
이는 다음과 동일합니다.
mongocxx::instance instance{}; // This should be done only once. mongocxx::uri uri("mongodb://localhost:27017"); mongocxx::client client(uri);
데이터베이스에 액세스
mongocxx:: 인스턴스 가 있는 경우 인스턴스 가 MongoDB deployment 에 연결된 경우,database()
메서드 또는 를 사용하여 operator[]
mongocxx:: 데이터베이스 를 가져옵니다. 인스턴스.
요청한 데이터베이스가 존재하지 않는 경우, 데이터를 처음 저장할 때 MongoDB가 데이터베이스를 생성합니다.
다음 예제에서는 mydb
데이터베이스에 액세스합니다.
auto db = client["mydb"];
컬렉션에 액세스
mongocxx:: 데이터베이스 가 있는 collection()
경우 인스턴스 에서 메서드 또는 를 사용하여 operator[]
mongocxx:: 컬렉션 을 가져옵니다. 인스턴스.
요청한 컬렉션이 존재하지 않는 경우, 데이터를 처음 저장할 때 MongoDB가 컬렉션을 생성합니다.
예를 들어, 이전 섹션에서 만든 db
인스턴스를 사용하여 다음 문은 mydb
데이터베이스의 test
컬렉션에 액세스합니다.
auto collection = db["test"];
문서 만들기
C++ 드라이버를 사용하여 document
를 만들려면 사용 가능한 두 가지 빌더 인터페이스 중 하나를 사용합니다.
- 스트림 빌더:
bsoncxx::builder::stream
- 리터럴 문서 구성에 적합한 스트리밍 연산자를 사용하는 문서 빌더입니다.
- 스트림 빌더:
- 기본 빌더:
bsoncxx::builder::basic
- 빌더 인스턴스에서 메서드를 호출하는 보다 일반적인 문서 빌더입니다.
- 기본 빌더:
이 가이드에서는 기본 빌더에 대해 간략하게만 설명합니다.
예를 들어 다음 JSON document 를 가정해 보겠습니다.
{ "name" : "MongoDB", "type" : "database", "count" : 1, "versions": [ "v6.0", "v5.0", "v4.4", "v4.2", "v4.0", "v3.6" ], "info" : { "x" : 203, "y" : 102 } }
기본 빌더 인터페이스를 사용하여 다음과 같이 이 문서를 구성할 수 있습니다.
auto doc_value = make_document( kvp("name", "MongoDB"), kvp("type", "database"), kvp("count", 1), kvp("versions", make_array("v6.0", "v5.0", "v4.4", "v4.2", "v4.0", "v3.6")), kvp("info", make_document(kvp("x", 203), kvp("y", 102))) );
이 bsoncxx::document::value
유형은 자체 메모리를 소유한 읽기 전용 객체 입니다. 이를 사용하려면 bsoncxx:: 문서::view 를 얻어야 합니다. 메서드 view()
사용:
auto doc_view = doc_value.view();
을(를) 사용하여 이 문서 뷰 내의 필드에 액세스 할 수 operator[]
있으며, 이 경우 bsoncxx:: 문서::element 가 반환됩니다. 인스턴스. 예를 예시 다음은 값이 string 인 name
필드 를 추출합니다.
auto element = doc_view["name"]; assert(element.type() == bsoncxx::type::k_string); auto name = element.get_string().value; // For C++ driver version < 3.7.0, use get_utf8() assert(0 == name.compare("MongoDB"));
이름 필드 의 값이 이 string 아니고 앞의 예시 와 같이 유형 가드를 포함하지 않은 경우 이 코드는 bsoncxx::예외 인스턴스 를 발생시킵니다.
문서 삽입
문서 하나 삽입
컬렉션에 단일 문서 를 삽입하려면 mongocxx:: 컬렉션 컬렉션 사용하세요. 인스턴스의 메서드를 insert_one()
사용하여 를 삽입합니다.{ "i": 0 }
auto insert_one_result = collection.insert_one(make_document(kvp("i", 0)));
insert_one_result
선택적 mongocxx::result::insert_one 입니다. . 이 예시 에서는 insert_one_result
가 설정하다 될 것으로 예상됩니다. 쓰기 (write) 작업의 기본값 동작은 서버 의 회신을 기다리는 것입니다. 승인되지 않은 mongocxx::write_concern을 설정하여 이를 재정의할 수 있습니다.
assert(insert_one_result); // Acknowledged writes return results.
문서에서 최상위 _id
필드를 지정하지 않으면 MongoDB는 삽입된 문서에 _id
필드를 자동으로 추가합니다.
반환 된 mongocxx::result::insert_one 의 메서드를 사용하여 이 값을 얻을 수 inserted_id()
있습니다. 인스턴스.
auto doc_id = insert_one_result->inserted_id(); assert(doc_id.type() == bsoncxx::type::k_oid);
여러 문서를 삽입합니다.
컬렉션에 여러 문서를 삽입하려면 mongocxx:: 컬렉션 insert_many()
컬렉션 사용하세요. 인스턴스의 메서드는 삽입할 문서 목록을 가져옵니다.
다음 예에서는 { "i": 1 }
및 { "i": 2 }
문서를 삽입합니다. 문서를 만들고 문서 목록에 추가합니다:
std::vector<bsoncxx::document::value> documents; documents.push_back(make_document(kvp("i", 1))); documents.push_back(make_document(kvp("i", 2)));
이러한 문서를 컬렉션에 삽입하려면 문서 목록을 insert_many()
메서드에 전달합니다.
auto insert_many_result = collection.insert_many(documents); assert(insert_many_result); // Acknowledged writes return results.
각 문서에 최상위 _id
필드를 지정하지 않으면 MongoDB는 삽입된 문서에 _id
필드를 자동으로 추가합니다.
반환 된 mongocxx::result::insert_many 의 메서드를 사용하여 이 값을 얻을 수 inserted_ids()
있습니다. 인스턴스.
auto doc0_id = insert_many_result->inserted_ids().at(0); auto doc1_id = insert_many_result->inserted_ids().at(1); assert(doc0_id.type() == bsoncxx::type::k_oid); assert(doc1_id.type() == bsoncxx::type::k_oid);
컬렉션 쿼리하기
컬렉션을 쿼리하려면 컬렉션의 find()
및 find_one()
메서드를 사용합니다.
find()
mongocxx:: 커서 의 인스턴스 를 반환합니다. 는 인스턴스 find_one()
를 std::optional< bsoncxx::document::value >
반환합니다. 자세한 내용은 bsoncxx:: 문서::value를 참조하세요.
빈 문서와 함께 메서드를 호출하여 컬렉션의 모든 문서를 쿼리하거나 필터를 전달하여 필터 기준과 일치하는 문서를 쿼리할 수 있습니다.
컬렉션에서 단일 문서 찾기
컬렉션에서 단일 문서를 반환하려면 매개변수 없이 find_one()
메서드를 사용합니다.
auto find_one_result = collection.find_one({}); if (find_one_result) { // Do something with *find_one_result } assert(find_one_result);
컬렉션의 모든 문서 찾기
auto cursor_all = collection.find({}); for (auto doc : cursor_all) { // Do something with doc assert(doc["_id"].type() == bsoncxx::type::k_oid); }
컬렉션의 모든 문서 인쇄
bsoncxx::to_json 함수는 BSON 문서 를 로 JSON string 변환합니다.
auto cursor_all = collection.find({}); std::cout << "collection " << collection.name() << " contains these documents:" << std::endl; for (auto doc : cursor_all) { std::cout << bsoncxx::to_json(doc, bsoncxx::ExtendedJsonMode::k_relaxed) << std::endl; } std::cout << std::endl;
위의 예는 다음과 유사한 출력을 출력합니다.
collection test contains these documents: { "_id" : { "$oid" : "6409edb48c37f371c70f03a1" }, "i" : 0 } { "_id" : { "$oid" : "6409edb48c37f371c70f03a2" }, "i" : 1 } { "_id" : { "$oid" : "6409edb48c37f371c70f03a3" }, "i" : 2 }
_id
요소는 MongoDB에 의해 문서에 자동으로 추가되었으며 값은 표시된 것과 다를 수 있습니다. MongoDB는 밑줄(_
)과 달러 기호($
)로 시작하는 필드 이름을 내부용으로 보관합니다.
쿼리 필터 지정
필터와 일치하는 단일 문서 가져오기
i
필드에 0
값이 있는 첫 번째 문서를 찾으려면 문서 {"i": 0}
를 전달하여 동등 조건을 지정합니다.
auto find_one_filtered_result = collection.find_one(make_document(kvp("i", 0))); if (find_one_filtered_result) { // Do something with *find_one_filtered_result }
필터와 일치하는 모든 문서 가져오기
다음 예에서는 0 < "i" <= 2
인 모든 문서를 가져옵니다.
auto cursor_filtered = collection.find(make_document(kvp("i", make_document(kvp("$gt", 0), kvp("$lte", 2))))); for (auto doc : cursor_filtered) { // Do something with doc assert(doc["_id"].type() == bsoncxx::type::k_oid); }
문서 업데이트
컬렉션의 문서를 업데이트하려면 컬렉션의 update_one()
및 update_many()
메서드를 사용할 수 있습니다.
업데이트 메서드는 업데이트 로 인해 수정된 문서 수를 포함한 작업에 대한 정보를 제공하는 std::optional<
mongocxx::result::update >
인스턴스 를 반환합니다. 자세한 내용은 mongocxx::result:: 업데이트 를 참조하세요.
단일 문서 업데이트
최대 하나의 문서를 업데이트하려면 update_one()
메서드를 사용합니다.
다음 예에서는 필터 { "i": 0 }
와 일치하는 첫 번째 문서를 업데이트하고 foo
값을 bar
로 설정합니다.
auto update_one_result = collection.update_one(make_document(kvp("i", 0)), make_document(kvp("$set", make_document(kvp("foo", "bar"))))); assert(update_one_result); // Acknowledged writes return results. assert(update_one_result->modified_count() == 1);
여러 문서 업데이트하기
필터와 일치하는 모든 문서를 업데이트하려면 update_many()
메서드를 사용합니다.
다음 예에서는 foo
값을 buzz
으로 설정하며, 여기서 i
는 0
보다 큽니다.
auto update_many_result = collection.update_many(make_document(kvp("i", make_document(kvp("$gt", 0)))), make_document(kvp("$set", make_document(kvp("foo", "buzz"))))); assert(update_many_result); // Acknowledged writes return results. assert(update_many_result->modified_count() == 2);
문서 삭제
컬렉션에서 문서를 삭제하려면 컬렉션의 delete_one()
및 delete_many()
메서드를 사용할 수 있습니다.
삭제 메서드는 삭제된 문서 수가 포함된 std::optional<
mongocxx::result::delete >
인스턴스 를 반환합니다. 자세한 내용은 mongocxx::result:: 삭제 를 참조하세요.
단일 문서 삭제
필터와 일치하는 문서를 하나만 삭제하려면 delete_one()
메서드를 사용합니다.
예를 들어 { "i": 0 }
필터와 일치하는 문서를 삭제하려면 다음을 수행합니다.
auto delete_one_result = collection.delete_one(make_document(kvp("i", 0))); assert(delete_one_result); // Acknowledged writes return results. assert(delete_one_result->deleted_count() == 1);
필터와 일치하는 모든 문서 삭제
필터와 일치하는 모든 문서를 삭제하려면 컬렉션의 delete_many()
메서드를 사용합니다.
다음 예에서는 i
가 0
보다 큰 모든 문서를 삭제합니다.
auto delete_many_result = collection.delete_many(make_document(kvp("i", make_document(kvp("$gt", 0))))); assert(delete_many_result); // Acknowledged writes return results. assert(delete_many_result->deleted_count() == 2);
생성 인덱스
필드 또는 필드 설정하다 에 인덱스 를 생성하려면 create_index()
mongocxx:: 컬렉션 의 메서드에 인덱스 사양 문서 를 전달합니다. 인스턴스. 인덱스 키 사양 문서 에는 인덱스 할 필드와 각 필드 의 인덱스 유형이 포함되어 있습니다.
{ "index1": "<type>", "index2": "<type>" }
오름차순 인덱스 유형의 경우
<type>
에 1 를 지정합니다.내림차순 인덱스 유형의 경우
<type>
에 -1 을 지정합니다.
다음 예에서는 i
필드에 오름차순 인덱스를 생성합니다.
auto index_specification = make_document(kvp("i", 1)); collection.create_index(std::move(index_specification));