Docs Menu
Docs Home
/ / /
Rust 드라이버
/ / /

대량 작업

이 페이지의 내용

  • 개요
  • 샘플 데이터
  • 대량 작업 유형
  • Insert
  • 바꾸기
  • Update
  • 삭제
  • 반환 유형
  • 동작 수정
  • 예시
  • 혼합 네임스페이스에 쓰기
  • 추가 정보

이 가이드 에서는 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) 작업을 수행할 수도 있습니다. UpdateOneModelInsertOneModel 를 동일한 bulk_write() 호출에 전달하는 예시 를 보려면 이 가이드 의 동작 수정 예시 를 참조하세요.

대량 삽입 작업을 수행하려면 삽입하려는 각 문서 에 대해 InsertOneModel 인스턴스 를 만듭니다. 그런 다음 모델 목록을 bulk_write() 메서드에 전달합니다.

다음 표에서는 해당 빌더 메서드를 호출하여 설정하다 수 있는 InsertOneModel 필드에 대해 설명합니다.

필드
설명
namespace
The namespace on which the insert is performed.
Type: Namespace
document
The document to insert.
Type: Document

이 예에서는 다음 조치를 수행합니다.

  • 배열 에 InsertOneModel 인스턴스 두 개를 지정합니다. 각 InsertOneModeldb.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 구조체 유형의 인스턴스를 삽입합니다.

#[derive(Serialize)]
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

일괄 업데이트 작업을 수행하려면 업데이트하려는 각 업데이트 에 대해 UpdateOneModel 또는 UpdateManyModel 인스턴스 를 만듭니다. 그런 다음 모델 목록을 bulk_write() 메서드에 전달합니다. UpdateOneModel 은 필터하다 와 일치하는 하나의 문서 만 업데이트하고 UpdateManyModel 는 필터하다 와 일치하는 모든 문서를 업데이트합니다.

다음 표에서는 해당 빌더 메서드를 호출하여 설정하다 수 있는 UpdateOneModelUpdateManyModel 필드에 대해 설명합니다.

필드
설명
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

이 예에서는 다음 조치를 수행합니다.

  • 배열 에 UpdateOneModelUpdateManyModel 인스턴스 를 지정합니다. 이러한 모델에는 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 는 필터하다 와 일치하는 모든 문서를 삭제합니다.

다음 표에서는 해당 빌더 메서드를 호출하여 설정하다 수 있는 DeleteOneModelDeleteManyModel 필드에 대해 설명합니다.

필드
설명
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

이 예에서는 다음 조치를 수행합니다.

  • 배열 에 DeleteOneModelDeleteManyModel 인스턴스 를 지정합니다. 이러한 모델에는 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

대량 작업에 학습 보려면 서버 매뉴얼의 대량 쓰기 작업 을 참조하세요.

돌아가기

삭제