복합 작업
개요
이 가이드에서는 복합 작업을 수행하는 방법에 대해 설명합니다.
복합 작업은 읽기 및 쓰기 작업을 단일 작업으로 결합합니다. 읽기 작업과 쓰기 작업을 따로 수행하면 두 작업 사이에 다른 사람이 문서를 변경할 가능성이 있습니다. MongoDB는 복합 작업이 수행되는 동안 수정 중인 문서에 쓰기 잠금을 설정하여 이를 방지합니다.
MongoDB는 다음과 같은 복합 연산을 지원합니다.
팁
둘 이상의 문서 를 쓰기 (write) 사용해야 하는 경우 트랜잭션을 사용하세요.
샘플 데이터
이 가이드의 예시에서는 다음 Course
구조체를 courses
collection의 문서 모델로 사용합니다.
type Course struct { Title string Enrollment int32 }
이 가이드의 예시를 실행하려면 다음 스니펫을 사용하여 샘플 데이터를 db.courses
collection에 로드하세요.
coll := client.Database("db").Collection("courses") docs := []interface{}{ Course{Title: "Representation Theory", Enrollment: 40}, Course{Title: "Early Modern Philosophy", Enrollment: 25}, Course{Title: "Animal Communication", Enrollment: 18}, } result, err := coll.InsertMany(context.TODO(), docs)
각 문서에는 각 문서의 title
및 enrollment
필드에 해당하는 과정의 제목 및 최대 등록 수를 비롯한 University 과정에 대한 설명이 포함되어 있습니다.
팁
존재하지 않는 데이터베이스 및 collection
쓰기 작업을 수행할 때 필요한 데이터베이스 및 collection이 없는 경우 서버는 이를 암시적으로 생성합니다.
찾기 및 삭제
FindOneAndDelete()
메서드는 지정된 쿼리 필터와 일치하는 첫 번째 문서를 찾아 삭제합니다. 이 메서드는 삭제된 문서가 포함된 SingleResult
을 반환합니다.
참고
FindOneAndDelete()
메서드는 원자 조작이므로 완료될 때까지 다른 쓰기 (write) 작업이 일치하는 문서를 변경하지 못하도록 합니다. deleteOne()
메서드도 원자 조작이지만 일치하는 문서의 정렬 순서를 지정할 수 없다는 점에서 FindOneAndDelete()
과 다릅니다.
단일 트랜잭션 에서 문서 를 찾아 삭제 필요가 없는 경우 findOne()
메서드를 호출한 다음 deleteOne()
메서드를 호출하면 됩니다.
동작 수정
FineOneAndDeleteOptions
를 전달하여 FindOneAndDelete()
메서드의 동작을 수정할 수 있습니다. FineOneAndDeleteOptions
를 지정하지 않으면 드라이버는 각 옵션의 기본값을 사용합니다.
FineOneAndDeleteOptions
유형을 사용하면 다음 방법으로 옵션을 구성할 수 있습니다.
메서드 | 설명 |
---|---|
SetCollation() | The type of language collation to use when sorting results. Default: nil |
SetMaxTime() | The maximum amount of time that the query can run on the server. Default: nil |
SetProjection() | The fields to include in the document returned. Default: nil |
SetSort() | The sort fields and directions to order the documents matched. Default: nil |
SetHint() | The index to use to scan for documents. Default: nil |
예시
다음 예시에서는 FindOneAndDelete()
메서드를 사용하여 enrollment
필드 값이 20보다 작은 첫 번째 문서를 일치시키고 삭제합니다.
filter := bson.D{{"enrollment", bson.D{{"$lt", 20}}}} var deletedDoc Course err := coll.FindOneAndDelete(context.TODO(), filter).Decode(&deletedDoc) if err != nil { panic(err) } res, _ := bson.MarshalExtJSON(deletedDoc, false, false) fmt.Println(string(res))
찾기 및 업데이트
FindOneAndUpdate()
메서드는 지정된 쿼리 필터와 일치하는 첫 번째 문서를 찾고, 업데이트 문서에 따라 업데이트합니다. 이 메서드는 일치하는 문서가 포함된 SingleResult
를 반환합니다.
참고
FindOneAndUpdate()
메서드는 원자 조작이므로 완료될 때까지 다른 쓰기 (write) 작업이 일치하는 문서를 변경하지 못하도록 합니다. updateOne()
메서드도 원자 조작이지만 일치하는 문서의 정렬 순서를 지정할 수 없다는 점에서 FindOneAndUpdate()
과 다릅니다.
단일 트랜잭션 에서 문서 를 찾고 업데이트 할 필요가 없는 경우 findOne()
메서드를 호출한 다음 updateOne()
메서드를 호출하면 됩니다.
동작 수정
FineOneAndUpdateOptions
를 전달하여 FindOneAndUpdate()
메서드의 동작을 수정할 수 있습니다. FineOneAndUpdateOptions
를 지정하지 않으면 드라이버는 각 옵션의 기본값을 사용합니다.
FineOneAndUpdateOptions
유형을 사용하면 다음 방법으로 옵션을 구성할 수 있습니다.
메서드 | 설명 |
---|---|
SetArrayFilters() | The array elements the update applies to. Default: nil |
SetBypassDocumentValidation() | Whether to allow the write operation to opt-out of document level validation. Default: false |
SetCollation() | The type of language collation to use when sorting results. Default: nil |
SetMaxTime() | The maximum amount of time that the query can run on the server. Default: nil |
SetProjection() | The fields to include in the document returned. Default: nil |
SetReturnDocument() | Whether to return the original or updated document in the SingleResult .Default: options.Before |
SetSort() | The sort fields and directions to order the documents matched. Default: nil |
SetUpsert() | Whether to insert a new document if the query filter doesn't match any documents. Default: false |
SetHint() | The index to use to scan for documents. Default: nil |
예시
다음 예시에서는 FindOneAndUpdate()
메서드를 사용하여 다음 조치를 순서대로 수행합니다.
title
필드 값에 'Modern'이 포함된 첫 번째 문서 와 일치합니다.일치하는 문서의
enrollment
필드 값을32
로 업데이트합니다.업데이트된 문서 반환
filter := bson.D{{"title", bson.D{{"$regex", "Modern"}}}} update := bson.D{{"$set", bson.D{{"enrollment", 32}}}} opts := options.FindOneAndUpdate().SetReturnDocument(options.After) var updatedDoc Course err := coll.FindOneAndUpdate(context.TODO(), filter, update, opts).Decode(&updatedDoc) if err != nil { panic(err) } res, _ := bson.MarshalExtJSON(updatedDoc, false, false) fmt.Println(string(res))
찾기 및 바꾸기
FindOneAndReplace()
메서드는 지정된 쿼리 필터와 일치하는 첫 번째 문서를 찾아 대체 문서로 바꿉니다. 이 메서드는 일치하는 문서가 포함된 SingleResult
를 반환합니다.
참고
이 메서드는 ReplaceOne()
메서드와 다릅니다. FindOneAndReplace()
는 찾기 및 바꾸기를 단일 작업으로 수행하므로 두 작업 사이에 누군가가 문서를 변경할 가능성을 제거합니다.
동작 수정
FineOneAndReplaceOptions
를 전달하여 FindOneAndReplace()
메서드의 동작을 수정할 수 있습니다. FineOneAndReplaceOptions
를 지정하지 않으면 드라이버는 각 옵션의 기본값을 사용합니다.
FineOneAndReplaceOptions
유형을 사용하면 다음 방법으로 옵션을 구성할 수 있습니다.
메서드 | 설명 |
---|---|
SetBypassDocumentValidation() | Whether to allow the write operation to opt-out of document level validation. Default: false |
SetCollation() | The type of language collation to use when sorting results. Default: nil |
SetMaxTime() | The maximum amount of time that the query can run on the server. Default: nil |
SetProjection() | The fields to include in the document returned. Default: nil |
SetReturnDocument() | Whether to return the original or replaced document in the SingleResult .Default: nil |
SetSort() | The sort fields and directions to order the documents matched. Default: nil |
SetUpsert() | Whether to insert a new document if the query filter doesn't match any documents. Default: false |
SetHint() | The index to use to scan for documents. Default: nil |
예시
다음 예시에서는 FindOneAndReplace()
메서드를 사용하여 다음 조치를 순서대로 수행합니다.
title
이 'Representation Theory'인 첫 번째 문서 와 일치합니다.일치하는 문서를
title
이 'Combinatorial Theory'이고enrollment
가35
인 새 문서로 대체합니다.
filter := bson.D{{"title", "Representation Theory"}} replacement := Course{Title: "Combinatorial Theory", Enrollment: 35} var outdatedDoc Course err := coll.FindOneAndReplace(context.TODO(), filter, replacement).Decode(&previousDoc) if err != nil { panic(err) } res, _ := bson.MarshalExtJSON(outdatedDoc, false, false) fmt.Println(string(res))
추가 정보
언급된 작업을 수행하는 방법에 대해 자세히 알아보려면 다음 가이드를 참조하세요:
API 문서
이 가이드에서 설명하는 메서드나 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.