AI 에이전트의 경우: 문서 인덱스는 https://www.mongodb.com/ko-kr/docs/llms.txt에서 사용할 수 있으며, 모든 페이지의 마크다운 버전은 어떤 URL 경로에 .md를 추가하여 사용할 수 있습니다.
Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
MongoDB Branding Shape
Click here >
Docs Menu

문서 교체

이 가이드 에서는 C++ 운전자 를 사용하여 MongoDB 컬렉션 에서 바꾸기 작업을 실행 하는 방법을 학습 수 있습니다. 바꾸기 작업은 대상 문서 에서 _id 필드 를 제외한 모든 필드를 제거하고 새 필드로 바꿉니다. replace_one() 메서드를 호출하여 단일 문서 를 바꿀 수 있습니다.

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

auto db = client["sample_restaurants"];
auto collection = db["restaurants"];

무료 MongoDB Atlas 클러스터 생성하고 샘플 데이터 세트를 로드하는 방법을 학습하려면 MongoDB 시작하기 가이드 를 참조하세요.

replace_one() 메서드를 호출하여 바꾸기 작업을 수행할 수 있습니다. 이 메서드는 검색 기준과 일치하는 첫 번째 문서 에서 _id 필드 를 제외한 모든 필드를 제거합니다. 그런 다음 지정한 필드와 값이 문서 에 삽입됩니다.

replace_one() 메서드에는 다음 매개 변수가 필요합니다.

  • 쿼리 필터하다 문서: 대체할 문서 를 지정합니다. 쿼리 필터에 대한 자세한 내용은 MongoDB Server 매뉴얼의 필터 문서 쿼리를 참조하세요.

  • 문서 바꾸기: 새 문서 에 삽입할 필드와 값을 지정합니다.

중요

_id 필드의 값은 변경할 수 없습니다. 대체 문서에서 _id 필드 값을 지정하는 경우 기존 문서의 _id 값과 일치해야 합니다.

다음 예시 에서는 replace_one() 메서드를 사용하여 name 필드 값이 "Nobu" 인 문서 를 name 필드 값이 "La Bernadin"인 새 문서 로 바꿉니다.

auto query_filter = make_document(kvp("name", "Nobu"));
auto replace_doc = make_document(kvp("name", "La Bernadin"));
auto result = collection.replace_one(query_filter.view(), replace_doc.view());

문서 를 성공적으로 교체했는지 확인하려면 find_one() 메서드를 사용하여 새 문서 를 인쇄할 수 있습니다.

auto new_doc = collection.find_one(make_document(kvp("name", "La Bernadin")));
std::cout << "New document: " << bsoncxx::to_json(*new_doc) << std::endl;
New document: { "_id" : { "$oid" : "..." }, "name" : "La Bernadin" }

find_one() 메서드에 대해 자세히 알아보려면 데이터 조회 가이드에서 하나의 문서 찾기 를 참조하세요.

mongocxx::options::replace 클래스의 인스턴스 를 선택적 인수로 전달하여 replace_one() 메서드의 동작을 수정할 수 있습니다. 다음 표에서는 mongocxx::options::replace 인스턴스 에서 설정하다 수 있는 필드에 대해 설명합니다.

필드
설명

bypass_document_validation

바꾸기 작업에서 문서 유효성 검사 우회할지 여부를 지정합니다. 로 설정하다 하면 true 스키마 유효성 검사 요구 사항을 충족하지 않는 새 문서 로 문서 바꿀 수 있습니다. 자세한 내용은 MongoDB Server 매뉴얼의 스키마 유효성 검사 참조하세요.
기본값은 false 입니다.

collation

결과를 정렬할 때 사용할 언어 데이터 정렬의 종류를 지정합니다. 자세한 내용은 MongoDB Server 매뉴얼에서 데이터 정렬 을 참조하세요.

comment

작업에 첨부할 유효한 BSON types의 주석을 지정합니다. 설정하다 되면 이 주석은 다음 위치에서 이 명령의 레코드와 함께 표시됩니다.

자세한 내용은 MongoDB Server 매뉴얼의 명령 필드 삽입 가이드 참조하세요.

hint

쿼리 필터하다 와 일치하는 문서를 스캔할 인덱스 지정합니다. 자세한 내용은 MongoDB Server 매뉴얼의 힌트 필드 참조하세요.

let

replace_one() 메서드에 사용할 변수와 해당 값이 포함된 문서 지정합니다. 이렇게 하면 변수를 작업 텍스트에서 분리하여 코드 가독성을 높일 수 있습니다. 값은 문서 필드를 참조하지 않는 상수 또는 닫힌 표현식이어야 합니다. 자세한 내용은 MongoDB Server 매뉴얼의 let 필드 참조하세요.

upsert

쿼리 필터하다 와 일치하는 문서가 없는 경우 대체 작업에서 업서트 작업을 수행할지 여부를 지정합니다.
기본값은 false 입니다.

write_concern

작업에 대한 쓰기 고려 (write concern) 설정합니다. 자세한 내용은 MongoDB Server 매뉴얼의 쓰기 고려를 참조하세요.

다음 예시 에서는 create_index() 메서드를 사용하여 name 필드 에 오름차순 단일 필드 인덱스 를 생성합니다. 그런 다음 hint 필드 를 새 인덱스 로 설정한 후 mongocxx::options::replace 객체 를 replace_one() 메서드에 전달합니다. 이는 name 필드 값이 "Nobu" 인 문서 를 대체할 때 name 필드 인덱스 를 검색 하도록 대체 작업에 지시합니다.

auto index_specification = make_document(kvp("name", 1));
collection.create_index(index_specification.view());
mongocxx::options::replace opts{};
opts.hint(mongocxx::hint{"name_1"});
auto query_filter = make_document(kvp("name", "Nobu"));
auto replace_doc = make_document(kvp("name", "La Bernadin"));
auto result = collection.replace_one(query_filter.view(), replace_doc.view(), opts);

인덱스에 학습 보려면 인덱스를 사용한 쿼리 최적화 가이드 를 참조하세요.

다음 예시 에서는 upsert 필드 값을 true 로 설정한 후 mongocxx::options::replace 객체 를 replace_one() 메서드에 전달합니다. 쿼리 필터하다 와 일치하는 문서가 없기 때문에 name 필드 값이 "Shake Shack" 인 새 문서 를 컬렉션 에 삽입하도록 바꾸기 작업을 지시합니다.

std::cout << "Total document count before replace_one(): " << collection.count_documents({}) << std::endl;
mongocxx::options::replace opts{};
opts.upsert(true);
auto query_filter = make_document(kvp("name", "In-N-Out Burger"));
auto replace_doc = make_document(kvp("name", "Shake Shack"));
auto result = collection.replace_one(query_filter.view(), replace_doc.view(), opts);
std::cout << "Total document count after replace_one(): " << collection.count_documents({}) << std::endl;
Total document count before replace_one(): 25359
Total document count after replace_one(): 25360

replace_one() 메서드는 mongocxx::result::replace 클래스의 인스턴스 를 반환합니다. 이 클래스에는 다음과 같은 멤버 함수가 포함되어 있습니다.

기능
설명

matched_count()

대체된 문서 수에 관계없이 쿼리 필터하다 와 일치하는 문서 수를 반환합니다.

modified_count()

대체 작업으로 수정된 문서 수를 반환합니다. 교체된 문서 원본과 동일한 경우 해당 문서는 이 계산에 포함되지 않습니다.

result()

작업에 대한 대량 쓰기 (write) 결과를 반환합니다.

upserted_id()

운전자 업서트 수행한 경우 데이터베이스 에 업서트된 문서 의 ID 반환합니다.

다음 예시 에서는 replace_one() 메서드를 사용하여 name 필드 값이 "Shake Shack" 인 문서 를 name 필드 값이 "In-N-Out Burger"인 새 문서 로 바꿉니다. 그런 다음 matched_count() 멤버 함수를 호출하여 쿼리 필터하다 와 일치하는 문서 수를 출력합니다.

auto query_filter = make_document(kvp("name", "Shake Shack"));
auto replace_doc = make_document(kvp("name", "In-N-Out Burger"));
auto result = collection.replace_one(query_filter.view(), replace_doc.view());
std::cout << "Matched documents: " << result->matched_count() << std::endl;
Matched documents: 11

다음 예시 에서는 replace_one() 메서드를 사용하여 name 필드 값이 "In-N-Out Burger"인 문서 를 바꿉니다. upsert 옵션이 true 로 설정하다 되어 있기 때문에 C++ 운전자 는 쿼리 필터하다 가 기존 문서와 일치하지 않을 때 새 문서 를 삽입합니다. 그런 다음 이 코드는 upserted_id() 멤버 함수를 호출하여 업서트 문서 의 _id 필드 값을 출력합니다.

mongocxx::options::replace opts{};
opts.upsert(true);
auto query_filter = make_document(kvp("name", "In-N-Out Burger"));
auto replace_doc = make_document(kvp("name", "Shake Shack"));
auto result = collection.replace_one(query_filter.view(), replace_doc.view(), opts);
auto id = result->upserted_id()->get_value();
std::cout << "Upserted ID: " << id.get_oid().value.to_string() << std::endl;
// Your ID value may differ
Upserted ID: 67128c5ecc1f8c15ea26fcf8

쿼리 필터 생성에 대해 자세히 알아보려면 쿼리 지정 가이드를 참조하세요.

이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.