AI 에이전트의 경우: 문서 인덱스는 https://www.mongodb.com/ko-kr/docs/llms.txt에서 사용할 수 있으며, 모든 페이지의 마크다운 버전은 어떤 URL 경로에 .md를 추가하여 사용할 수 있습니다.
Docs Menu

대량 작업

이 가이드 에서는 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

삽입이 수행되는 네임스페이스입니다.
유형: Namespace

document

삽입할 문서
.유형: 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

작업이 수행되는 네임스페이스입니다.
유형: Namespace

filter

교체하려는 문서와 일치하는 필터 입니다.
유형: Document

replacement

대체 문서.
유형: Document

collation

(선택 사항) 결과를 정렬할 때 사용할 데이터 정렬입니다. 데이터 정렬에 대해 자세히 알아보려면 데이터 정렬 가이드를 참조하세요.
유형: Document

hint

(선택 사항) 작업에 사용할 인덱스입니다. 인덱스에 대해 자세히 알아보려면 인덱스 가이드를 참조하세요.
유형: Bson

upsert

(선택 사항) 필터와 일치하는 문서 없는 경우 새 문서 생성할지 여부를 지정합니다.
기본값 으로 이 필드 false로 설정하다 됩니다.
유형: 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

작업이 수행되는 네임스페이스입니다.
유형: Namespace

filter

업데이트 하려는 하나 이상의 문서와 일치하는 필터하다 입니다. UpdateOneModel에 지정하면 첫 번째 일치하는 문서 만 업데이트됩니다. UpdateManyModel에 지정하면 일치하는 모든 문서가 업데이트됩니다.
유형: Document

update

수행할 업데이트 입니다.
유형: UpdateModifications

array_filters

(Optional) 배열 값 필드 업데이트하는 경우 업데이트 적용되는 배열 요소를 지정하는 필터 설정하다 입니다.
유형: Array

collation

(선택 사항) 결과를 정렬할 때 사용할 데이터 정렬입니다. 데이터 정렬에 대해 자세히 알아보려면 데이터 정렬 가이드를 참조하세요.
유형: Document

hint

(선택 사항) 작업에 사용할 인덱스입니다. 인덱스에 대해 자세히 알아보려면 인덱스 가이드를 참조하세요.
유형: Bson

upsert

(선택 사항) 필터하다 와 일치하는 문서 없는 경우 새 문서 생성할지 여부를 지정합니다. 기본값 으로 이 필드 false로 설정하다 됩니다.
유형: 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

작업이 수행되는 네임스페이스입니다.
유형: Namespace

filter

삭제 하려는 하나 이상의 문서와 일치하는 필터하다 입니다. DeleteOneModel에 지정하면 일치하는 첫 번째 문서 만 삭제됩니다. DeleteManyModel에 지정하면 일치하는 모든 문서가 삭제됩니다.
유형: Document

collation

(선택 사항) 결과를 정렬할 때 사용할 데이터 정렬입니다. 데이터 정렬에 대해 자세히 알아보려면 데이터 정렬 가이드를 참조하세요.
유형: Document

hint

(선택 사항) 작업에 사용할 인덱스입니다. 인덱스에 대해 자세히 알아보려면 인덱스 가이드를 참조하세요.
유형: 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

지정된 순서대로 작업이 실행되는지 여부를 지정합니다.
true으로 설정하면 하나의 작업이 실패할 경우 이후 작업이 실행되지 않습니다.
false으로 설정하면 하나의 작업이 실패할 경우도 서버는 계속해서 쓰기 (write) 작업을 시도합니다.
유형: bool

true

bypass_document_validation

문서 수준 유효성 검사를 우회할지 여부입니다.
유형: bool

false

comment

데이터베이스 프로파일러, currentOp 및 로그를 통해 작업을 추적하는 데 도움이 되는 임의 주석입니다.
유형: Bson

None

let_vars

불크 쓰기 내의 모든 작업에 적용할 매개변수 이름과 값의 매핑입니다. 값은 문서 필드를 참조하지 않는 상수 또는 닫힌 표현식이어야 합니다.
유형: Document

None

write_concern

이 일괄 작업에 사용할 쓰기 고려(write concern)입니다.
유형: 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

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

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