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

복합 작업

이 가이드에서는 복합 작업을 수행하는 방법에 대해 설명합니다.

복합 작업은 읽기 및 쓰기 작업을 단일 작업으로 결합합니다. 읽기 작업과 쓰기 작업을 따로 수행하면 두 작업 사이에 다른 사람이 문서를 변경할 가능성이 있습니다. MongoDB는 복합 작업이 수행되는 동안 수정 중인 문서에 쓰기 잠금을 설정하여 이를 방지합니다.

MongoDB는 다음과 같은 복합 연산을 지원합니다.

한 번에 두 개 이상의 문서에서 복합 연산을 수행하는 방법을 알아보려면 트랜잭션 가이드를 참조하세요.

이 가이드의 예시에서는 courses collection의 문서에 대한 모델로 다음 Course 구조체를 사용합니다.

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)

각 문서에는 각 문서의 titleenrollment 필드에 해당하는 과정의 제목 및 최대 등록 수를 비롯한 University 과정에 대한 설명이 포함되어 있습니다.

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

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

FindOneAndDelete() 메서드는 지정된 쿼리 필터와 일치하는 첫 번째 문서를 찾아 삭제합니다. 이 메서드는 삭제된 문서가 포함된 SingleResult 을 반환합니다.

참고

FindOneAndDelete() 메서드는 원자 조작이므로 완료될 때까지 다른 쓰기 (write) 작업이 일치하는 문서를 변경하지 못하도록 합니다. DeleteOne() 메서드도 원자 조작이지만 일치하는 문서의 정렬 순서를 지정할 수 없다는 점에서 FindOneAndDelete()과 다릅니다.

별도의 작업으로 문서 찾아 삭제 하려면 FindOne() 메서드를 호출한 다음 DeleteOne() 메서드를 호출합니다.

FindOneAndDeleteOptions를 전달하여 FindOneAndDelete() 메서드의 동작을 수정할 수 있습니다. FindOneAndDeleteOptions를 지정하지 않으면 드라이버는 각 옵션의 기본값을 사용합니다.

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

메서드
설명

SetCollation()

결과를 정렬할 때 사용할 언어 데이터 정렬 유형입니다.
기본값: nil

SetMaxTime()

서버에서 쿼리를 실행할 수 있는 최대 시간입니다.
기본값: nil

SetProjection()

반환된 문서에 포함할 필드입니다.
기본값: nil

SetSort()

일치하는 문서를 정렬하는 정렬 필드와 방향이 일치합니다.
기본값: nil

SetHint()

문서 스캔에 사용할 인덱스입니다.
기본값: 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))
{"title":"Animal Communication","enrollment":18}

FindOneAndUpdate() 메서드는 지정된 쿼리 필터와 일치하는 첫 번째 문서를 찾고, 업데이트 문서에 따라 업데이트합니다. 이 메서드는 일치하는 문서가 포함된 SingleResult를 반환합니다.

참고

FindOneAndUpdate() 메서드는 원자 조작이므로 완료될 때까지 다른 쓰기 (write) 작업이 일치하는 문서를 변경하지 못하도록 합니다. UpdateOne() 메서드도 원자 조작이지만 일치하는 문서의 정렬 순서를 지정할 수 없다는 점에서 FindOneAndUpdate()과 다릅니다.

문서를 찾아 별도의 작업으로 업데이트하려면 FindOne() 메서드를 호출한 다음 UpdateOne() 메서드를 호출합니다.

FindOneAndUpdateOptions를 전달하여 FindOneAndUpdate() 메서드의 동작을 수정할 수 있습니다. FindOneAndUpdateOptions를 지정하지 않으면 드라이버는 각 옵션의 기본값을 사용합니다.

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

메서드
설명

SetArrayFilters()

업데이트가 적용되는 배열 요소입니다.
기본값: nil

SetBypassDocumentValidation()

문서 수준 유효성 검사를 거부하는 쓰기 작업을 허용할지 여부를 지정합니다.
기본값: false

SetCollation()

결과를 정렬할 때 사용할 언어 데이터 정렬 유형입니다.
기본값: nil

SetMaxTime()

서버에서 쿼리를 실행할 수 있는 최대 시간입니다.
기본값: nil

SetProjection()

반환된 문서에 포함할 필드입니다.
기본값: nil

SetReturnDocument()

SingleResult에서 원본 또는 업데이트된 문서를 반환할지 여부입니다.
기본값: options.Before

SetSort()

일치하는 문서를 정렬하는 정렬 필드와 방향이 일치합니다.
기본값: nil

SetUpsert()

쿼리 필터가 문서와 일치하지 않는 경우 새 문서를 삽입할지 여부를 지정합니다.
기본값: false

SetHint()

문서 스캔에 사용할 인덱스입니다.
기본값: 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))
{"title":"Early Modern Philosophy","enrollment":32}

FindOneAndReplace() 메서드는 지정된 쿼리 필터와 일치하는 첫 번째 문서를 찾아 대체 문서로 바꿉니다. 이 메서드는 일치하는 문서가 포함된 SingleResult를 반환합니다.

참고

이 메서드는 ReplaceOne() 메서드와 다릅니다. FindOneAndReplace() 는 찾기 및 바꾸기를 단일 작업으로 수행하므로 두 작업 사이에 누군가가 문서 변경할 가능성을 제거합니다. FindOneAndReplace()를 사용하면 일치하는 문서에 정렬 순서를 설정하다 수도 있습니다.

별도의 작업으로 문서 찾아 바꾸려면 FindOne() 메서드를 호출한 다음 ReplaceOne() 메서드를 호출합니다.

FindOneAndReplaceOptions를 전달하여 FindOneAndReplace() 메서드의 동작을 수정할 수 있습니다. FindOneAndReplaceOptions를 지정하지 않으면 드라이버는 각 옵션의 기본값을 사용합니다.

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

메서드
설명

SetBypassDocumentValidation()

문서 수준 유효성 검사를 거부하는 쓰기 작업을 허용할지 여부를 지정합니다.
기본값: false

SetCollation()

결과를 정렬할 때 사용할 언어 데이터 정렬 유형입니다.
기본값: nil

SetMaxTime()

서버에서 쿼리를 실행할 수 있는 최대 시간입니다.
기본값: nil

SetProjection()

반환된 문서에 포함할 필드입니다.
기본값: nil

SetReturnDocument()

SingleResult에서 원본 또는 교체된 문서를 반환할지 여부입니다.
기본값: nil

SetSort()

일치하는 문서를 정렬하는 정렬 필드와 방향이 일치합니다.
기본값: nil

SetUpsert()

쿼리 필터가 문서와 일치하지 않는 경우 새 문서를 삽입할지 여부를 지정합니다.
기본값: false

SetHint()

문서 스캔에 사용할 인덱스입니다.
기본값: nil

다음 예시에서는 FindOneAndReplace() 메서드를 사용하여 다음 조치를 순서대로 수행합니다.

  • title 이 'Representation Theory'인 첫 번째 문서 와 일치합니다.

  • 일치하는 문서를 title이 'Combinatorial Theory'이고 enrollment35인 새 문서로 대체합니다.

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))
{"title":"Representation Theory","enrollment":40}

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

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