문서 메뉴
문서 홈
/ / /
Go 드라이버
/ / /

대량 작업

이 페이지의 내용

  • 개요
  • 샘플 데이터
  • 대량 쓰기
  • 동작 수정
  • 반환 값
  • 운영
  • 삽입
  • 바꾸기
  • 업데이트
  • 삭제
  • 실행 순서
  • 순서 지정됨
  • 순서 지정되지 않음
  • 추가 정보
  • 관련 작업
  • API 문서

이 가이드에서는 대량 작업을 사용하는 방법에 대해 설명합니다.

대량 작업은 다수의 쓰기 작업을 수행합니다. 대량 작업은 데이터베이스에 대한 각각의 작업을 호출하는 대신 한 번의 호출로 여러 작업을 수행합니다.

이 가이드의 예제에서는 다음 Book 구조체를 books collection의 문서 모델로 사용합니다.

type Book struct {
Title string
Author string
Length int32
}

이 가이드의 예제를 실행하려면 다음 스니펫을 사용하여 샘플 데이터를 db.books collection에 로드하세요.

coll := client.Database("db").Collection("books")
docs := []interface{}{
Book{Title: "My Brilliant Friend", Author: "Elena Ferrante", Length: 331},
Book{Title: "Lucy", Author: "Jamaica Kincaid", Length: 103},
}
result, err := coll.InsertMany(context.TODO(), docs)

각 문서에는 각 문서의 title, author, length 필드에 해당하는 제목, 저자 및 페이지 길이가 포함된 책에 대한 설명이 포함되어 있습니다.

존재하지 않는 데이터베이스 및 collection

쓰기 작업을 수행할 때 필요한 데이터베이스 및 collection이 없는 경우 서버는 이를 암시적으로 생성합니다.

대량 작업을 수행하려면 WriteModel 문서 배열을 BulkWrite() 메서드에 전달합니다.

BulkWrite() 메서드는 선택적으로 BulkWriteOptions 유형을 사용하며, 이는 동작을 수정하는 데 사용할 수 있는 옵션입니다. BulkWriteOptions를 지정하지 않으면 드라이버는 각 옵션의 기본값을 사용합니다.

BulkWriteOptions 유형을 사용하면 다음 방법으로 옵션을 구성할 수 있습니다.

메서드
설명
SetBypassDocumentValidation()
문서 수준 유효성 검사를 거부하는 쓰기 작업을 허용할지 여부를 지정합니다.
기본값입니다: false
SetOrdered()
오류가 발생한 후 쓰기 작업 수행을 중지할지 여부를 지정합니다.
기본값입니다: true

성공적인 경우 BulkWrite() 메서드는 대량 작업에 대한 정보를 포함하는 BulkWriteResult 유형을 반환합니다. BulkWriteResult 유형에는 다음과 같은 속성이 포함되어 있습니다.

속성
설명
InsertedCount
삽입된 문서 수입니다.
MatchedCount
업데이트 및 바꾸기 작업에서 쿼리 필터 와 일치하는 문서 수입니다.
ModifiedCount
업데이트 및 대체 작업에 의해 수정된 문서 수입니다.
DeletedCount
삭제된 문서 수입니다.
UpsertedCount
업데이트 및 대체 작업에 의해 업서트된 문서 수입니다.
UpsertedIDs
업서트된 각 문서의 _id에 대한 작업 인덱스 맵입니다.

WriteModel은 삽입, 대체, 업데이트 또는 삭제 작업을 나타냅니다.

삽입 작업을 수행하려면 삽입하려는 문서를 지정하는 InsertOneModel을 만듭니다. 여러 문서를 삽입하려면 삽입하려는 각 문서에 대해 InsertOneModel을 만듭니다.

InsertOneModel을 사용하면 다음 메서드를 사용하여 동작을 지정할 수 있습니다.

메서드
설명
SetDocument()
삽입할 문서입니다.

다음 예에서는 두 개의 문서를 삽입하기 위해 두 개의 InsertOneModel 인스턴스를 만듭니다.

models := []mongo.WriteModel{
mongo.NewInsertOneModel().SetDocument(Book{Title: "Beloved", Author: "Toni Morrison", Length: 324}),
mongo.NewInsertOneModel().SetDocument(Book{Title: "Outline", Author: "Rachel Cusk", Length: 258}),
}

대체 작업을 수행하려면 대체하려는 문서와 대체 문서를 지정하는 ReplaceOneModel을 만듭니다. 여러 문서를 대체하려면 대체하려는 각 문서에 대해 ReplaceOneModel을 만듭니다.

ReplaceOneModel에서는 다음 메서드를 사용하여 동작을 지정할 수 있습니다.

메서드
설명
SetCollation()
결과를 정렬할 때 사용할 언어 데이터 정렬 유형입니다.
SetFilter()
대체할 문서를 지정하는 쿼리 필터입니다.
SetHint()
문서를 스캔할 때 사용할 인덱스입니다.
SetReplacement()
일치하는 문서를 대체할 문서입니다.
SetUpsert()
쿼리 필터가 문서와 일치하지 않는 경우 새 문서를 삽입할지 여부를 지정합니다.

다음 예에서는 title이 'Lucy'인 문서를 새 문서로 대체하기 위해 ReplaceOneModel을 만듭니다.

models := []mongo.WriteModel{
mongo.NewReplaceOneModel().SetFilter(bson.D{{"title", "Lucy"}}).
SetReplacement(Book{Title: "On Beauty", Author: "Zadie Smith", Length: 473}),
}

업데이트 작업을 수행하려면 업데이트할 문서와 문서 업데이트를 지정하는 UpdateOneModel을 만듭니다. 여러 문서를 업데이트하려면 UpdateManyModel을 사용합니다.

UpdateOneModelUpdateManyModel을 사용하면 다음 메서드를 통해 동작을 지정할 수 있습니다.

메서드
설명
SetArrayFilters()
업데이트가 적용되는 배열 요소입니다.
SetCollation()
결과를 정렬할 때 사용할 언어 데이터 정렬 유형입니다.
SetFilter()
업데이트할 문서를 지정하는 쿼리 필터입니다.
SetHint()
문서를 스캔할 때 사용할 인덱스입니다.
SetUpdate()
일치하는 문서에 적용할 수정 사항입니다.
SetUpsert()
쿼리 필터가 문서와 일치하지 않는 경우 새 문서를 삽입할지 여부를 지정합니다.

다음 예에서는 author가 'Elena Ferrante'인 경우 문서의 length15만큼 줄이는 UpdateOneModel을 만듭니다.

models := []mongo.WriteModel{
mongo.NewUpdateOneModel().SetFilter(bson.D{{"author", "Elena Ferrante"}}).
SetUpdate(bson.D{{"$inc", bson.D{{"length", -15}}}}),
}

삭제 작업을 수행하려면 삭제하려는 문서를 지정하는 DeleteOneModel을 만듭니다. 여러 문서를 삭제하려면 DeleteManyModel을 사용합니다

DeleteOneModelDeleteManyModel을 사용하면 다음 메서드를 통해 동작을 지정할 수 있습니다.

메서드
설명
SetCollation()
결과를 정렬할 때 사용할 언어 데이터 정렬 유형입니다.
SetFilter()
삭제할 문서를 지정하는 쿼리 필터입니다.
SetHint()
문서를 스캔할 때 사용할 인덱스입니다.

다음 예에서는 length300보다 큰 문서를 삭제하기 위해 DeleteManyModel을 만듭니다.

models := []mongo.WriteModel{
mongo.NewDeleteManyModel().SetFilter(bson.D{{"length", bson.D{{"$gt", 300}}}}),
}

BulkWrite() 메서드를 사용하면 BulkWriteOptions에서 대량 작업을 순서가 지정된 대로 실행할지 아니면 순서가 지정되지 않은 상태로 실행할지 지정할 수 있습니다.

기본적으로 BulkWrite() 메서드는 추가된 순서대로 대량 작업을 실행하고 오류가 발생하면 중지합니다.

이는 SetOrdered() 메서드에 true로 지정하는 것과 같은 효과를 냅니다.

opts := options.BulkWrite().SetOrdered(true)

대량 쓰기 작업을 임의의 순서로 실행하고 오류가 발생해도 계속 진행하려면 SetOrdered() 메서드에 false를 지정합니다. 그러면 이 메서드가 나중에 오류를 보고합니다.

다음 예에서는 아래 조치를 순서와 상관없이 수행합니다.

  • 두 개의 문서를 삽입합니다.

  • title이 'My Brilliant Friend'인 문서를 새 문서로 대체합니다.

  • 현재 length 값이 200보다 작으면 모든 문서의 length10씩 증가시킵니다.

  • author 필드 값에 'Jam'이 포함된 모든 문서를 삭제합니다.

models := []mongo.WriteModel{
mongo.NewInsertOneModel().SetDocument(Book{Title: "Middlemarch", Author: "George Eliot", Length: 904}),
mongo.NewInsertOneModel().SetDocument(Book{Title: "Pale Fire", Author: "Vladimir Nabokov", Length: 246}),
mongo.NewReplaceOneModel().SetFilter(bson.D{{"title", "My Brilliant Friend"}}).
SetReplacement(Book{Title: "Atonement", Author: "Ian McEwan", Length: 351}),
mongo.NewUpdateManyModel().SetFilter(bson.D{{"length", bson.D{{"$lt", 200}}}}).
SetUpdate(bson.D{{"$inc", bson.D{{"length", 10}}}}),
mongo.NewDeleteManyModel().SetFilter(bson.D{{"author", bson.D{{"$regex", "Jam"}}}}),
}
opts := options.BulkWrite().SetOrdered(false)
results, err := coll.BulkWrite(context.TODO(), models, opts)
if err != nil {
panic(err)
}
fmt.Printf("Number of documents inserted: %d\n", results.InsertedCount)
fmt.Printf("Number of documents replaced or updated: %d\n", results.ModifiedCount)
fmt.Printf("Number of documents deleted: %d\n", results.DeletedCount)

다음 문서는 대량 작업 후 books 컬렉션에 포함됩니다.

{"title":"Atonement","author":"Ian McEwan","length":351}
{"title":"Middlemarch","author":"George Eliot","length":904}
{"title":"Pale Fire","author":"Vladimir Nabokov","length":246}

대량 작업에 실행 가능한 예시를 보려면 대량 작업 수행을 참조하세요.

언급된 작업을 수행하는 방법에 대해 자세히 알아보려면 다음 가이드를 참조하세요:

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

← 한 번의 작업으로 삽입 또는 업데이트