대량 작업
개요
이 가이드 에서는 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
필드에 대해 설명합니다.
필드 | 설명 |
---|---|
namespace | The namespace on which the insert is performed. Type: Namespace |
document | The document to insert. Type: Document |
문서 삽입 예시
이 예에서는 다음 조치를 수행합니다.
배열 에
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
필드에 대해 설명합니다.
필드 | 설명 |
---|---|
namespace | The namespace on which the operation is performed. Type: Namespace |
filter | The filter that matches the document you want to replace. Type: Document |
replacement | The replacement document. Type: Document |
collation | (Optional) The collation to use when sorting results. To learn more about collations,
see the Collations guide. Type: Document |
hint | (Optional) The index to use for the operation. To learn more about
indexes, see the Indexes guide. Type: Bson |
upsert | (Optional) Whether a new document is created if no document matches the filter. By default, this field is set to false .Type: bool |
예시
이 예에서는 다음 조치를 수행합니다.
배열 에
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
필드에 대해 설명합니다.
필드 | 설명 |
---|---|
namespace | The namespace on which the operation is performed. Type: Namespace |
filter | The filter that matches one or more documents you want to update. When specified in an UpdateOneModel ,
only the first matching document will be updated. When specified in an UpdateManyModel , all
matching documents will be updated.Type: Document |
update | The update to perform. Type: UpdateModifications |
array_filters | (Optional) A set of filters specifying which array elements an update applies to if you are updating an
array-valued field. Type: Array |
collation | (Optional) The collation to use when sorting results. To learn more about collations,
see the Collations guide. Type: Document |
hint | (Optional) The index to use for the operation. To learn more about
indexes, see the Indexes guide. Type: Bson |
upsert | (Optional) Whether a new document is created if no document matches the filter.
By default, this field is set to false .Type: bool |
예시
이 예에서는 다음 조치를 수행합니다.
배열 에
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
필드에 대해 설명합니다.
필드 | 설명 |
---|---|
namespace | The namespace on which the operation is performed. Type: Namespace |
filter | The filter that matches one or more documents you want to delete. When specified in a DeleteOneModel ,
only the first matching document will be deleted. When specified in a DeleteManyModel , all
matching documents will be deleted.Type: Document |
collation | (Optional) The collation to use when sorting results. To learn more about collations,
see the Collations guide. Type: Document |
hint | (Optional) The index to use for the operation. To learn more about
indexes, see the Indexes guide. Type: Bson |
예시
이 예에서는 다음 조치를 수행합니다.
배열 에
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
구조체에는 다음 필드가 포함되어 있습니다.
필드 | 설명 | 기본값 |
---|---|---|
ordered | Whether the operations run in the order in which they were specified. When set to true , one failed operation prevents subsequent operations from running.When set to false , the server continues to attempt write operations if one fails.Type: bool | true |
bypass_document_validation | Whether document-level validation is bypassed. Type: bool | false |
comment | An arbitrary comment to help trace the operation through the database profiler, currentOp,
and logs. Type: Bson | None |
let_vars | A map of parameter names and values to apply to all operations within the bulk write.
Values must be constant or closed expressions that do not reference document fields. Type: Document | None |
write_concern | The write concern to use for this bulk operation. Type: WriteConcern | 네임스페이스의 쓰기 고려 (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
추가 정보
대량 작업에 학습 보려면 서버 매뉴얼의 대량 쓰기 작업 을 참조하세요.