개요
이 가이드 에서는 Rust 운전자 를 사용하여 대량 작업 을 수행하는 방법을 학습 수 있습니다.
대량 작업은 하나 이상의 네임스페이스 에 대해 여러 쓰기 (write) 작업을 수행합니다. 네임스페이스 는 <database>.<collection> 형식의 데이터베이스 이름과 컬렉션 이름의 조합입니다. Client 인스턴스 에서 대량 작업을 수행하므로 클라이언트 가 액세스하는 클러스터 의 모든 네임스페이스 에 대해 대량 작업을 수행할 수 있습니다.
대량 작업을 수행하여 서버 에 대한 호출 수를 줄일 수 있습니다. 대량 작업은 각 작업에 대한 요청 을 보내는 대신 하나의 조치 내에서 여러 작업을 수행합니다.
이 가이드에는 다음 섹션이 포함되어 있습니다.
샘플 데이터 는 대량 작업 예제에서 사용되는 샘플 데이터를 제공합니다.
대량 작업 유형
WriteModel유형을 사용하여 대량 삽입, 바꾸기, 업데이트 및 삭제 작업을 수행하는 방법을 설명합니다.반환 유형 은
bulk_write()메서드의 반환 값과 대량 작업에 대한 정보에 액세스 하는 방법을 설명합니다.동작 수정은
bulk_write()메서드의 기본값 동작을 수정하는 방법을 설명합니다.혼합 네임스페이스에 쓰기 에서는 한 번의 메서드 호출로 여러 네임스페이스에 대해 대량 작업을 수행하는 방법을 설명합니다.
추가 정보에서 이 가이드에 언급된 유형 및 메소드에 대한 리소스 및 API 문서 링크를 찾을 수 있습니다.
중요
대량 쓰기 (write) 작업을 수행하려면 애플리케이션 이 다음 요구 사항을 충족하는지 확인하세요.
MongoDB Server 버전 8.0 이상에 연결되어 있습니다.
Rust 운전자 버전 3.0 이상을 사용하고 있습니다.
샘플 데이터
이 가이드 의 예제에서는 db 데이터베이스 의 mushrooms 컬렉션 에 저장된 다음 샘플 문서를 사용합니다.
let docs = vec![ doc! {"name" : "portobello", "color" : "brown", "edible" : true }, doc! {"name" : "chanterelle", "color" : "yellow", "edible" : true }, doc! {"name" : "oyster", "color" : "white", "edible" : true }, doc! {"name" : "fly agaric", "color" : "red", "edible" : false }, ];
사용자 지정 구조체 유형을 사용하여 샘플 데이터를 표현할 수도 있습니다. Mushroom 구조체를 사용하여 동일한 데이터를 모델링하는 대량 작업을 수행하는 예시 는 이 페이지의 구조체 삽입 예제 를 참조하세요.
대량 작업 유형
대량 쓰기 (write) 작업을 수행하려면 WriteModel 열거형 인스턴스의 배열 을 bulk_write() 메서드에 전달합니다.
이 섹션에서는 해당 WriteModel 유형을 정의하여 다음과 같은 대량 쓰기 (write) 작업을 수행하는 방법에 학습 수 있습니다.
팁
단일 bulk_write() 메서드 호출로 여러 유형의 쓰기 (write) 작업을 수행할 수도 있습니다. UpdateOneModel 및 InsertOneModel 를 동일한 bulk_write() 호출에 전달하는 예시 를 보려면 이 가이드 의 동작 수정 예시 를 참조하세요.
Insert
대량 삽입 작업을 수행하려면 삽입하려는 각 문서 에 대해 InsertOneModel 인스턴스 를 만듭니다. 그런 다음 모델 목록을 bulk_write() 메서드에 전달합니다.
다음 표에서는 해당 빌더 메서드를 호출하여 설정하다 수 있는 InsertOneModel 필드에 대해 설명합니다.
필드 | 설명 |
|---|---|
| 삽입이 수행되는 네임스페이스입니다. |
| 삽입할 문서 |
문서 삽입 예시
이 예에서는 다음 조치를 수행합니다.
배열 에
InsertOneModel인스턴스 두 개를 지정합니다. 각InsertOneModel는db.mushrooms네임스페이스 에 삽입할 문서 를 나타냅니다.모델 배열 을
bulk_write()메서드에 전달합니다.삽입된 문서 수를 인쇄합니다.
let mushrooms: Collection<Document> = client.database("db").collection("mushrooms"); let models = vec![ InsertOneModel::builder() .namespace(mushrooms.namespace()) .document(doc! { "name": "lion's mane", "color": "white", "edible": true }) .build(), InsertOneModel::builder() .namespace(mushrooms.namespace()) .document(doc! { "name": "angel wing", "color": "white", "edible": false }) .build(), ]; let result = client.bulk_write(models).await?; println!("Inserted documents: {}", result.inserted_count);
Inserted documents: 2
구조체 삽입 예시
구조체를 사용하고 구조체 인스턴스를 db.mushrooms 네임스페이스 에 대량 삽입하여 문서를 모델링할 수도 있습니다.
이 예시 에서는 앞의 문서 삽입 예제 와 동일한 작업을 수행하지만 다음 Mushroom 구조체 유형의 인스턴스를 삽입합니다.
struct Mushroom { name: String, color: String, edible: bool, }
다음 코드는 insert_one_model() 메서드를 사용하여 각 Mushroom 인스턴스 에서 InsertOneModel 를 구성한 다음 두 모델을 대량 작업에 삽입합니다.
let mushrooms: Collection<Mushroom> = client.database("db").collection("mushrooms"); let lions_mane = Mushroom { name: "lion's mane".to_string(), color: "white".to_string(), edible: true, }; let angel_wing = Mushroom { name: "angel wing".to_string(), color: "white".to_string(), edible: false, }; let lions_mane_model = mushrooms.insert_one_model(lions_mane)?; let angel_wing_model = mushrooms.insert_one_model(angel_wing)?; let result = client.bulk_write([lions_mane_model, angel_wing_model]).await?; println!("Inserted documents: {}", result.inserted_count);
Inserted documents: 2
팁
Rust 운전자 의 사용자 지정 구조체 유형 및 직렬화에 학습 보려면 데이터 모델링 및 직렬화가이드 를 참조하세요.
바꾸기
일괄 교체 작업을 수행하려면 교체하려는 각 문서 에 대해 ReplaceOneModel 인스턴스 를 만듭니다. 그런 다음 모델 목록을 bulk_write() 메서드에 전달합니다.
다음 표에서는 해당 빌더 메서드를 호출하여 설정하다 수 있는 ReplaceOneModel 필드에 대해 설명합니다.
필드 | 설명 |
|---|---|
| 작업이 수행되는 네임스페이스입니다. |
| 교체하려는 문서와 일치하는 필터 입니다. |
| 대체 문서. |
| (선택 사항) 결과를 정렬할 때 사용할 데이터 정렬입니다. 데이터 정렬에 대해 자세히 알아보려면 데이터 정렬 가이드를 참조하세요. |
| (선택 사항) 작업에 사용할 인덱스입니다. 인덱스에 대해 자세히 알아보려면 인덱스 가이드를 참조하세요. |
| (선택 사항) 필터와 일치하는 문서 없는 경우 새 문서 생성할지 여부를 지정합니다. |
예시
이 예에서는 다음 조치를 수행합니다.
배열 에
ReplaceOneModel인스턴스 두 개를 지정합니다.ReplaceOneModel인스턴스에는db.mushrooms네임스페이스 에서 버섯을 나타내는 문서를 교체하는 지침이 포함되어 있습니다.모델 배열 을
bulk_write()메서드에 전달합니다.수정된 문서 수를 인쇄합니다.
let mushrooms: Collection<Document> = client.database("db").collection("mushrooms"); let models = vec![ ReplaceOneModel::builder() .namespace(mushrooms.namespace()) .filter(doc! { "name": "portobello" }) .replacement(doc! { "name": "cremini", "color": "brown", "edible": true }) .build(), ReplaceOneModel::builder() .namespace(mushrooms.namespace()) .filter(doc! { "name": "oyster" }) .replacement(doc! { "name": "golden oyster", "color": "yellow", "edible": true }) .upsert(true) .build(), ]; let result = client.bulk_write(models).await?; println!("Modified documents: {}", result.modified_count);
Modified documents: 2
Update
일괄 업데이트 작업을 수행하려면 업데이트하려는 각 업데이트 에 대해 UpdateOneModel 또는 UpdateManyModel 인스턴스 를 만듭니다. 그런 다음 모델 목록을 bulk_write() 메서드에 전달합니다. UpdateOneModel 은 필터하다 와 일치하는 하나의 문서 만 업데이트하고 UpdateManyModel 는 필터하다 와 일치하는 모든 문서를 업데이트합니다.
다음 표에서는 해당 빌더 메서드를 호출하여 설정하다 수 있는 UpdateOneModel 및 UpdateManyModel 필드에 대해 설명합니다.
필드 | 설명 |
|---|---|
| 작업이 수행되는 네임스페이스입니다. |
| 업데이트 하려는 하나 이상의 문서와 일치하는 필터하다 입니다. |
| 수행할 업데이트 입니다. |
| (Optional) 배열 값 필드 업데이트하는 경우 업데이트 적용되는 배열 요소를 지정하는 필터 설정하다 입니다. |
| (선택 사항) 결과를 정렬할 때 사용할 데이터 정렬입니다. 데이터 정렬에 대해 자세히 알아보려면 데이터 정렬 가이드를 참조하세요. |
| (선택 사항) 작업에 사용할 인덱스입니다. 인덱스에 대해 자세히 알아보려면 인덱스 가이드를 참조하세요. |
| (선택 사항) 필터하다 와 일치하는 문서 없는 경우 새 문서 생성할지 여부를 지정합니다. 기본값 으로 이 필드 |
예시
이 예에서는 다음 조치를 수행합니다.
배열 에
UpdateOneModel및UpdateManyModel인스턴스 를 지정합니다. 이러한 모델에는db.mushrooms네임스페이스 에서 버섯을 나타내는 문서를 업데이트 하기 위한 지침이 포함되어 있습니다.모델 배열 을
bulk_write()메서드에 전달합니다.수정된 문서 수를 인쇄합니다.
let mushrooms: Collection<Document> = client.database("db").collection("mushrooms"); let models = vec![ WriteModel::UpdateOne( UpdateOneModel::builder() .namespace(mushrooms.namespace()) .filter(doc! { "name": "fly agaric" }) .update(doc! { "$set": { "name": "fly amanita" } }) .upsert(true) .build(), ), WriteModel::UpdateMany( UpdateManyModel::builder() .namespace(mushrooms.namespace()) .filter(doc! { "color": "yellow" }) .update(doc! { "$set": { "color": "yellow/orange" } }) .build(), ), ]; let result = client.bulk_write(models).await?; println!("Modified documents: {}", result.modified_count);
Modified documents: 2
삭제
일괄 삭제 작업을 수행하려면 각 삭제 작업에 대해 DeleteOneModel 또는 DeleteManyModel 인스턴스 를 만듭니다. 그런 다음 모델 목록을 bulk_write() 메서드에 전달합니다. DeleteOneModel 은 필터하다 와 일치하는 문서 를 하나만 삭제하고 DeleteManyModel 는 필터하다 와 일치하는 모든 문서를 삭제합니다.
다음 표에서는 해당 빌더 메서드를 호출하여 설정하다 수 있는 DeleteOneModel 및 DeleteManyModel 필드에 대해 설명합니다.
필드 | 설명 |
|---|---|
| 작업이 수행되는 네임스페이스입니다. |
| 삭제 하려는 하나 이상의 문서와 일치하는 필터하다 입니다. |
| (선택 사항) 결과를 정렬할 때 사용할 데이터 정렬입니다. 데이터 정렬에 대해 자세히 알아보려면 데이터 정렬 가이드를 참조하세요. |
| (선택 사항) 작업에 사용할 인덱스입니다. 인덱스에 대해 자세히 알아보려면 인덱스 가이드를 참조하세요. |
예시
이 예에서는 다음 조치를 수행합니다.
배열 에
DeleteOneModel및DeleteManyModel인스턴스 를 지정합니다. 이러한 모델에는db.mushrooms네임스페이스 에서 버섯을 나타내는 문서를 삭제 하는 지침이 포함되어 있습니다.모델 배열 을
bulk_write()메서드에 전달합니다.삭제된 문서 수를 인쇄합니다.
let mushrooms: Collection<Document> = client.database("db").collection("mushrooms"); let models = vec![ WriteModel::DeleteOne( DeleteOneModel::builder() .namespace(mushrooms.namespace()) .filter(doc! { "color": "red" }) .build(), ), WriteModel::DeleteMany( DeleteManyModel::builder() .namespace(mushrooms.namespace()) .filter(doc! { "edible": true }) .build(), ), ]; let result = client.bulk_write(models).await?; println!("Deleted documents: {}", result.deleted_count);
Deleted documents: 4
반환 유형
bulk_write() 메서드는 대량 작업에 대한 정보에 액세스 할 수 있는 SummaryBulkWriteResult 구조체 인스턴스 를 반환합니다.
SummaryBulkWriteResult 유형에는 다음과 같은 필드가 있습니다.
inserted_count: 삽입된 문서 수matched_count: 일치하는 문서 수modified_count: 업데이트된 문서 수upserted_count: 업서트된 문서 수deleted_count: 삭제된 문서 수
verbose_results() 메서드를 사용하여 각 작업에 대한 자세한 정보를 볼 수도 있습니다. verbose_results() 메서드는 다음 필드가 있는 VerboseBulkWriteResult 구조체 인스턴스 를 반환합니다.
delete_results: 성공적인 각 삭제 작업의 결과insert_results: 성공적인 각 삽입 작업의 결과update_results: 성공적인 각 업데이트 작업의 결과summary: 각 작업 유형의 결과 요약
다음 예시 에서는 verbose_results() 메서드를 bulk_write() 메서드에 연결하고 업데이트 및 삭제 작업 결과를 출력합니다.
let models = vec![ WriteModel::DeleteOne( DeleteOneModel::builder() .namespace(mushrooms.namespace()) .filter(doc! { "name": "oyster" }) .build(), ), WriteModel::UpdateOne( UpdateOneModel::builder() .namespace(mushrooms.namespace()) .filter(doc! { "name": "chanterelle" }) .update(doc! { "$set": { "season": ["July", "August", "September"] } }) .build(), ), ]; let result = client.bulk_write(models).verbose_results().await?; println!( "Update results: {:?}\nDelete results: {:?}\n", result.update_results, result.delete_results );
Update results: {1: UpdateResult { matched_count: 1, modified_count: 1, upserted_id: None }} Delete results: {0: DeleteResult { deleted_count: 1 }}
동작 수정
BulkWriteOptions 필드 값을 설정하여 bulk_write() 메서드의 동작을 수정할 수 있습니다. 이러한 구조체 필드를 설정하다 하려면 필드의 해당 메서드를 bulk_write() 메서드에 연결합니다.
BulkWriteOptions 구조체에는 다음 필드가 포함되어 있습니다.
필드 | 설명 | 기본값 |
|---|---|---|
| 지정된 순서대로 작업이 실행되는지 여부를 지정합니다. |
|
| 문서 수준 유효성 검사를 우회할지 여부입니다. |
|
| 데이터베이스 프로파일러, currentOp 및 로그를 통해 작업을 추적하는 데 도움이 되는 임의 주석입니다. |
|
| 불크 쓰기 내의 모든 작업에 적용할 매개변수 이름과 값의 매핑입니다. 값은 문서 필드를 참조하지 않는 상수 또는 닫힌 표현식이어야 합니다. |
|
| 이 일괄 작업에 사용할 쓰기 고려(write concern)입니다. | 네임스페이스의 쓰기 고려 (write concern) 고려를 상속합니다. |
예시
이 예시 에서는 mushrooms 컬렉션 에서 업데이트 및 삽입 작업을 수행하려고 시도합니다. 다음 코드는 ordered() 메서드를 bulk_write() 메서드에 연결하여 ordered 필드 를 false (으)로 설정합니다.
let mushrooms: Collection<Document> = client.database("db").collection("mushrooms"); let models = vec![ WriteModel::UpdateOne(UpdateOneModel::builder() .namespace(mushrooms.namespace()) .filter(doc! { "name": "portobello" }) .update(doc! { "$set": { "_id": 123 } }) .upsert(true) .build()), WriteModel::InsertOne(InsertOneModel::builder() .namespace(mushrooms.namespace()) .document(doc! { "name": "reishi", "color": "red/brown", "edible": true }) .build()), ]; let result = client.bulk_write(models).ordered(false).await?; println!( "Inserted documents: {}\nDeleted documents: {}", result.inserted_count, result.deleted_count );
Error: Error { kind: BulkWrite(BulkWriteError { write_concern_errors: [], write_errors: {0: WriteError { code: 66, code_name: None, message: "Plan executor error during update :: caused by :: Performing an update on the path '_id' would modify the immutable field '_id'", details: None }}, partial_result: Some(Summary(SummaryBulkWriteResult { inserted_count: 1, matched_count: 0, modified_count: 0, upserted_count: 0, deleted_count: 0 })) }), labels: ... }
_id 필드 는 변경할 수 없으며 업데이트 작업에서 변경할 수 없습니다. UpdateOneModel 에는 이 필드 를 업데이트 하기 위한 지침이 포함되어 있으므로 대량 작업은 BulkWriteError 를 반환하고 삽입 작업만 수행합니다. ordered 필드 를 true 로 설정하다 하면 운전자 는 업데이트 작업이 실패한 후 후속 작업을 시도하지 않으며 운전자 는 문서를 삽입하지 않습니다.
혼합 네임스페이스에 쓰기
이 페이지의 앞의 예제에서는 db.mushrooms 네임스페이스 에서 대량 작업을 수행합니다. 그러나 한 번의 메서드 호출로 여러 네임스페이스에 대한 대량 쓰기를 수행할 수 있습니다.
다음 예시 에서는 ingredients.sweet 네임스페이스 에 문서 하나를 삽입하고 meals.dessert 네임스페이스 에 문서 하나를 삽입합니다.
let sweet: Collection<Document> = client .database("ingredients") .collection("sweet"); let dessert: Collection<Document> = client .database("meals") .collection("dessert"); let models = vec![ InsertOneModel::builder() .namespace(sweet.namespace()) .document(doc! { "name": "brown sugar", "price": 3.99 }) .build(), InsertOneModel::builder() .namespace(dessert.namespace()) .document(doc! { "name": "banana bread", "cook_time": 75 }) .build(), ]; let result = client.bulk_write(models).await?; println!("Inserted documents: {}", result.inserted_count);
Inserted documents: 2
추가 정보
대량 작업에 학습 보려면 서버 매뉴얼의 대량 쓰기 작업 을 참조하세요.
API 문서
이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.