Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/ / /
Go 드라이버
/

CRUD 작업 구성

이 가이드 에서는 고 (Go) 운전자 사용하여 읽기 및 쓰기 (write) 작업을 구성하는 방법을 학습 수 있습니다.

읽기 설정 (read preference) 설정하여 운전자 읽기 작업을 라우팅하는 방법을 제어할 수 있습니다. 또한 읽기 고려 (read concern) 또는 쓰기 고려 (write concern) 설정하여 운전자 데이터 일관성 및 내구성을 처리하는 방식을 제어할 수도 있습니다. 읽기 고려는 읽기 작업을 수행할 때 데이터에 필요한 내구성 수준을 지정하고, 쓰기 (write) 고려는 운전자 복제본 세트 에서 쓰기 (write) 작업의 승인을 기다리는 방법을 지정합니다.

다음 수준에서 쓰기 고려, 읽기 고려, 읽기 설정 옵션을 설정할 수 있습니다.

  • 재정의되지 않는 한 모든 작업 실행의 기본값을 설정하는 클라이언트 수준

  • 세션 수준

  • 트랜잭션 수준

  • 데이터베이스 수준

  • 컬렉션 수준

앞의 목록은 옵션 설정의 우선 순위가 높아지는 순서도 나타냅니다. 예시 를 들어, 트랜잭션 에 대해 읽기 고려 (read concern) 설정하다 하면 클라이언트 에 대해 설정하다 읽기 고려 (read concern) 재정의됩니다.

쓰기 고려 (write concern) 작업이 성공적인 으로 반환되기 전에 삽입 또는 업데이트 와 같은 쓰기 (write) 작업을 승인해야 하는 복제본 세트 의 데이터 보유 노드 수를 설명합니다. 기본값 으로 쓰기 (write) 작업은 프라이머리 복제본 세트 구성원만 승인한 경우에 성공적인 .

MongoDB 고 (Go) 드라이버 복제본 세트 에 대한 쓰기 고려 (write concern) 지정할 수 있는 writeconcern 패키지 제공합니다. WriteConcern 유형의 인스턴스 SetWriteConcern() 메서드에 전달하여 쓰기 고려 (write concern) 설정합니다. WriteConcern 유형은 일반적인 쓰기 고려 (write concern) 사양을 선택할 수 있는 다음 메서드를 제공합니다.

메서드
설명

Custom()

The client requests acknowledgement that write operations propagate to tagged members of a mongod instance. For more information, see the Write Concern specification.

Parameter: tag (string)

Journaled()

The client requests acknowledgement that the replica set has written the changes to the on-disk journal. For more information, see the Write Concern specification.

Parameter: none

Majority()

The client requests acknowledgement that write operations propagate to the majority of data-bearing voting members. For more information, see the Write Concern specification.

Parameter: none

Unacknowledged()

The client requests requests no acknowledgment of write operations. For more information, see the Write Concern specification for w: 0.

Parameter: none

W1()

The client requests acknowledgement that the replica set has written the changes to memory on one node, such as the standalone mongod or the primary in a replica set. For more information, see the Write Concern specification for w: 1.

Parameter: none

쓰기 고려 시간 초과

WriteConcern 인스턴스 에는 시간 초과를 설정하다 수 없습니다. 대신 컨텍스트를 생성할 때 WithTimeout() 메서드를 사용하여 작업 수준에서 시간 초과를 설정하다 . 자세한 학습 은 연결 옵션 가이드 에서 서버 실행 시간 제한 을 참조하세요.

보다 특수한 쓰기 고려가 필요한 경우 사용자 지정 WriteConcern 구조체 리터럴을 정의할 수 있습니다. WriteConcern 구조체에 다음 필드를 설정할 수 있습니다.

필드
설명

W

Specifies the number of mongod instances or tagged members that write operations must propagate to for acknowledgement. Common values include 1, 0, and "majority".

Type: string or int

Journal

Specifies whether the replica set must write the changes to the on-disk journal for acknowledgement.

Type: bool

또는 연결 문자열 에 쓰기 고려 (write concern) 지정할 수 있습니다. 자세한 내용은 쓰기 고려 옵션에 대한 서버 매뉴얼 항목을 참조하세요.

다음 코드는 클라이언트 및 컬렉션 수준에서 다양한 쓰기 (write) 고려를 지정하는 방법을 보여줍니다. 클라이언트 수준 쓰기 고려 (write concern) 두 복제본 세트 멤버에게 승인을 요청하고 저널링을 false로 설정합니다. 컬렉션 수준 쓰기 고려 (write concern) 대다수의 복제본 세트 멤버에게 승인을 요청합니다.

uri := "mongodb://<hostname>:<port>"
journal := false
cliWC := &writeconcern.WriteConcern{
W: 2,
Journal: &journal,
}
clOpts := options.Client().ApplyURI(uri).SetWriteConcern(cliWC)
client, err := mongo.Connect(clOpts)
...
collWC := writeconcern.Majority()
collOpts := options.Collection().SetWriteConcern(collWC)
coll := client.Database("db").Collection("myColl", collOpts)

사용자는 읽기 고려 (read concern) 옵션을 통해 클라이언트가 쿼리에서 반환하는 데이터를 결정할 수 있습니다. 기본 읽기 고려 (read concern) 수준은 "local"인데, 클라이언트가 최신 인스턴스 데이터를 반환하며 데이터가 복제본 세트 노드의 대부분에 쓰였다는 보장은 없다는 의미입니다.

MongoDB 고 (Go) 드라이버 복제본 세트 에 대한 읽기 고려 (read concern) 지정할 수 있는 readconcern 패키지 제공합니다. ReadConcern 유형의 인스턴스 SetReadConcern() 메서드에 전달하여 읽기 고려 (read concern) 설정합니다. ReadConcern 유형에는 읽기 고려 (read concern) 지정하는 다음과 같은 메서드가 있습니다.

메서드
설명

Available()

쿼리는 데이터가 대부분의 복제본 세트 멤버에 기록되었다는 보장 없이 인스턴스에서 데이터를 반환합니다. 자세한 내용은 읽기 고려 사양을 참조하세요.

Linearizable()

쿼리 majority 쓰기 고려 (write concern) 로 발행되고 읽기 작업이 시작되기 전에 승인된 모든 성공적인 쓰기를 반영하는 데이터를 반환합니다. 자세한 내용은 읽기 고려 사양을 참조하세요.

Local()

쿼리는 인스턴스의 가장 최근 데이터를 반환합니다. 자세한 내용은 읽기 고려 사양을 참조하세요.

Majority()

이 쿼리는 복제본 세트의 과반수 이상의 멤버에 기록된 것으로 확인된 인스턴스의 가장 최근 데이터를 반환합니다. 자세한 내용은 읽기 고려 사양을 참조하세요.

Snapshot()

쿼리 특정 점 의 mongod 인스턴스 에 있는 데이터의 전체 복사본을 반환합니다. 이 옵션은 다중 문서 트랜잭션 내의 작업에만 사용할 수 있습니다. 자세한 내용은 읽기 고려 사양을 참조하세요.

다음 코드는 "majority"의 읽기 고려 (read concern)를 지정하는 방법을 보여줍니다. 그런 다음 코드는 이 옵션을 사용하여 Collection 를 선택합니다.

rc := readconcern.Majority()
opts := options.Collection().SetReadConcern(rc)
database := client.Database("db")
coll := database.Collection("myCollection", opts)

읽기 설정 (read preference) 옵션은 MongoDB 클라이언트가 읽기 작업을 복제본 세트의 노드로 라우팅하는 방법을 지정합니다. 애플리케이션은 기본값으로 복제본 세트의 프라이머리 노드에 읽기 작업을 지시합니다.

읽기 설정은 읽기 설정 모드와 선택적으로 태그 세트 목록, maxStalenessSeconds 옵션 및 헤지된 읽기( hedged read ) 옵션으로 구성됩니다.

MongoDB 고 (Go) 드라이버 복제본 세트 에 대한 읽기 설정 (read preference) 지정할 수 있는 readpref 패키지 제공합니다. ReadPref 유형의 인스턴스 SetReadPreference() 메서드에 전달하여 읽기 설정 (read preference) 지정합니다. ReadPref 유형에는 읽기 설정 (read preference) 지정하는 다음과 같은 메서드가 있습니다.

메서드
설명

Nearest()

클라이언트 지정된 지연 시간 임계값에 따라 임의의 적격 복제본 세트 멤버에서 읽습니다. 자세한 내용은 읽기 설정 서버 수동 항목을 참조하세요.

Primary()

클라이언트는 현재 복제본 세트 프라이머리 노드에서 읽습니다. 자세한 내용은 읽기 설정 MongoDB Server 수동 항목을 참조하세요.

PrimaryPreferred()

클라이언트 프라이머리 노드가 사용 가능한 경우 프라이머리 노드 에서 읽습니다. 프라이머리 사용할 수 없는 경우 작업은 세컨더리 멤버로부터 읽습니다. 자세한 내용은 읽기 설정 서버 수동 항목을 참조하세요.

Secondary()

클라이언트는 복제본 세트의 세컨더리 멤버에서 읽습니다. 자세한 내용은 읽기 설정 MongoDB Server 수동 항목을 참조하세요.

SecondaryPreferred()

클라이언트 하나 이상의 세컨더리 노드를 사용할 수 있는 경우 해당 세컨더리 노드에서 읽습니다. 세컨더리를 사용할 수 없는 경우 작업은 프라이머리 멤버에서 읽습니다. 자세한 내용은 읽기 설정 서버 수동 항목을 참조하세요.

또는 연결 문자열 에 읽기 설정 (read preference) 지정할 수 있습니다. 자세한 내용은 읽기 기본 설정 옵션에 대한 서버 매뉴얼 항목 을 참조하세요.

다음 코드는 세컨더리 노드에서 읽도록 읽기 설정을 지정하는 방법을 보여줍니다. 그런 다음 코드는 이 옵션을 사용하여 Database를 선택합니다.

rp := readpref.Secondary()
opts := options.Database().SetReadPreference(rp)
database := client.Database("db", opts)

고 (Go) 운전자 네트워크 또는 서버 오류로 인해 특정 읽기 및 쓰기 (write) 작업이 실패할 경우 자동으로 한 번만 자동으로 재시도합니다.

options.Client 구조체를 사용하여 새 클라이언트 생성할 때 RetryReads 또는 RetryWrites 옵션을 False 로 설정하여 재시도 가능 읽기 또는 재시도 가능 쓰기를 명시적으로 비활성화할 수 있습니다.

다음 예시 ClientOptions 세터 함수를 사용하여 클라이언트 에 대해 재시도 가능 읽기 및 쓰기를 비활성화합니다.

// Defines the client options
clientOps := options.Client().
ApplyURI(uri).
SetRetryWrites(false).
SetRetryReads(false)
// Creates a new client using the specified options
client, err := mongo.Connect(clientOps)
if err != nil {
panic(err)
}

지원되는 재시도 가능 읽기 작업에 대해 자세히 학습 MongoDB Server 매뉴얼의 재시도 가능 읽기를 참조하세요. 지원되는 재시도 가능 쓰기 (write) 작업에 대해 자세히 학습 MongoDB Server 매뉴얼의 재시도 가능 쓰기 참조하세요.

데이터 정렬 을 지정하여 읽기 및 쓰기 (write) 작업의 동작을 수정할 수 있습니다. 데이터 정렬은 대소문자 및 악센트 표시와 같이 문자열 비교를 위한 언어별 규칙 설정하다 입니다.

기본값으로 MongoDB는 바이너리 데이터 정렬을 사용하여 문자열을 정렬합니다. 이 기본값 정렬은 ASCII 표준 문자 값을 사용하여 문자열을 비교하고 순서를 지정합니다. 언어 및 국가 및 언어 설정에는 ASCII 표준과 다른 특정 문자 순서 규칙이 있으며, 작업에 다른 데이터 정렬 규칙 설정하다 적용 하도록 선택할 수 있습니다.

다음 수준에서 데이터 정렬을 지정할 수 있습니다.

  • 컬렉션: 컬렉션 작업에 대한 기본값 데이터 정렬을 설정합니다. 기존 컬렉션 에 대해서는 데이터 정렬을 정의할 수 없습니다.

  • 인덱스: 인덱스 사용하는 작업에 대한 데이터 정렬을 설정합니다.

  • 작업: 작업의 데이터 정렬을 설정하고 상속된 모든 데이터 정렬을 재정의합니다.

데이터 정렬을 지정하려면 Collation 객체 만듭니다. Collation 객체 의 Locale 필드 정의해야 하지만 다른 모든 필드는 선택 사항입니다. 예시 들어, 다음 코드 예시 "en_US" 국가 및 언어 설정 설정 데이터 정렬을 사용하여 Collation 객체 지정합니다.

myCollation := &options.Collation{Locale: "en_US"}

객체 필드의 전체 목록은 데이터 정렬 Collation API 문서 를 참조하세요. . 지원되는 모든 국가 및 언어 설정과 Locale 필드의 기본값을 보려면 지원되는 언어 및 국가 및 언어 설정을 방문하세요.

새 컬렉션 또는 뷰를 만들 때 데이터 정렬을 적용할 수 있습니다. 이는 해당 컬렉션 또는 뷰에서 호출되는 모든 작업에 대한 기본 데이터 정렬을 정의합니다. CreateCollectionOptions 또는 CreateViewOptions 객체를 통해 데이터 정렬을 설정합니다. 그런 다음 옵션 객체를 인수로 사용하여 CreateCollection() 또는 CreateView() 메서드를 호출합니다.

다음 예제에서는 books 라는 새 컬렉션을 만들고 "fr" 국가 및 언어 설정을 사용하여 기본 데이터 정렬을 지정합니다. Strength 데이터 정렬 필드의 값은 1 로, 문자 악센트의 차이를 무시합니다.

myCollation := &options.Collation{Locale: "fr", Strength: 1}
opts := options.CreateCollection().SetCollation(myCollation)
err := db.CreateCollection(context.TODO(), "books", opts)
if err != nil {
panic(err)
}

books 컬렉션에서 데이터 정렬을 사용하는 작업을 호출하는 경우 작업은 컬렉션 만들기 예제에 지정된 기본 데이터 정렬을 사용합니다.

books 컬렉션에 다음 문서가 포함되어 있다고 가정합니다.

{"name" : "Emma", "length" : "474"}
{"name" : "Les Misérables", "length": "1462"}
{"name" : "Infinite Jest", "length" : "1104"}
{"name" : "Cryptonomicon", "length" : "918"}
{"name" : "Ça", "length" : "1138"}

참고

문서를 삽입하는 방법을 학습 문서 삽입을 참조하세요.

다음 예제에서는 Find() 메서드를 사용하여 알파벳순으로 "Infinite Jest" name 값이 있는 모든 문서를 반환합니다.

filter := bson.D{{"name", bson.D{{"$lt", "Infinite Jest"}}}}
cursor, err := coll.Find(context.TODO(), filter)
if err != nil {
panic(err)
}
var results []bson.D
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
res, _ := bson.MarshalExtJSON(result, false, false)
fmt.Println(string(res))
}
{"name":"Emma","length":"474"}
{"name":"Cryptonomicon","length":"918"}
{"name":"Ça","length":"1138"}

코드에 기본값 books 데이터 정렬을 지정하지 않으면 Find() 메서드는 기본값 바이너리 데이터 정렬 규칙에 따라 "Infinite Jest" 앞에 오는 name 값을 결정합니다. 이 규칙은 "I"로 시작하는 단어 뒤에 "Ç"로 시작하는 단어를 배치합니다. 출력은 다음과 유사합니다.

{"name":"Emma","length":"474"}
{"name":"Cryptonomicon","length":"918"}

메서드에 대해 Find() 자세히 학습 문서 찾기를 참조하세요.

컬렉션에 새 인덱스를 만들 때 데이터 정렬을 적용할 수 있습니다. 인덱스는 컬렉션에 문서의 순서가 지정된 표현을 저장하므로 MongoDB 인스턴스는 메모리 내 정렬 작업에 대한 순서를 수행하지 않습니다.

작업에서 인덱스를 사용하려면 작업에서 인덱스에 지정된 데이터 정렬과 동일한 데이터 정렬을 사용해야 합니다. 또한 작업이 데이터 정렬이 포함된 인덱스에 포함되는지 확인합니다. IndexOptions 객체를 통해 데이터 정렬을 설정하고 이 객체를 CreateOne() 메서드에 인수로 전달합니다.

컬렉션 만들기 예제 섹션에 표시된 대로 books 컬렉션을 만들고 기본 데이터 정렬을 적용한 후에는 컬렉션의 기본 데이터 정렬을 변경할 수 없습니다. 그러나 다른 데이터 정렬을 사용하여 컬렉션에 대한 인덱스를 만들 수 있습니다.

다음 예제에서는 CreateOne() 메서드를 사용하여 name 필드에 오름차순 인덱스를 만들고 "en_US" 국가 및 언어 설정으로 새 데이터 정렬을 지정합니다.

myCollation := &options.Collation{Locale: "en_US"}
opts := options.Index().SetCollation(myCollation)
indexModel := mongo.IndexModel{
Keys: bson.D{{"name", 1}},
Options: opts,
}
name, err := coll.Indexes().CreateOne(context.TODO(), indexModel)
if err != nil {
panic(err)
}
fmt.Println("Name of Index Created: " + name)
Name of Index Created: name_1

컬렉션에서 문서를 읽고, 업데이트하고, 삭제하는 작업에는 데이터 정렬을 사용할 수 있습니다. 작업에 데이터 정렬을 적용하면 이전에 컬렉션에 대해 정의된 기본 데이터 정렬이 재정의됩니다.

인덱스의 데이터 정렬과 다른 작업에 새 데이터 정렬을 적용하는 경우 해당 인덱스를 사용할 수 없습니다. 결과적으로 작업이 인덱스에 포함되는 작업만큼 제대로 수행되지 않을 수 있습니다. 인덱스에 포함되지 않는 정렬 작업의 단점에 대한 자세한 내용은 인덱스를 사용하여 쿼리 결과 정렬을 참조하세요. 데이터 정렬을 지원하는 작업 목록은 MongoDB 매뉴얼 을 참조하세요.

데이터 정렬을 지원하는 작업을 사용하여 books 컬렉션의 문서를 업데이트하고 쿼리할 수 있습니다.

다음 예제에서는 Find() 메서드를 사용하여 length 값이 "1000" 보다 큰 문서를 반환합니다. NumericOrdering 데이터 정렬 필드의 값은 true 로, 값이 알파벳 순서가 아닌 숫자 순서로 정렬되도록 합니다.

filter := bson.D{{"length", bson.D{{"$gt", "1000"}}}}
myCollation := &options.Collation{Locale: "en_US", NumericOrdering: true}
opts := options.Find().SetCollation(myCollation)
cursor, err := coll.Find(context.TODO(), filter, opts)
if err != nil {
panic(err)
}
var results []bson.D
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
res, _ := bson.MarshalExtJSON(result, false, false)
fmt.Println(string(res))
}
{"name":"Les Misérables","length":"1462"}
{"name":"Infinite Jest","length":"1104"}
{"name":"Ça","length":"1138"}

코드에서 NumericOrdering 필드 true로 설정하다 데이터 정렬을 지정하지 않으면 동일한 Find() 작업이 length 값을 문자열로 비교합니다. 이 경우 출력은 다음과 유사합니다.

{"name":"Emma","length":"474"}
{"name":"Les Misérables","length":"1462"}
{""name":"Infinite Jest","length":"1104"}
{"name":"Cryptonomicon","length":"918"}
{"name":"Ça","length":"1138"}

Find() 메서드에 학습 보려면 문서 찾기 가이드 를 참조하세요.

이 가이드 에서 설명하는 개념에 대해 자세히 학습 다음 매뉴얼 페이지를 방문하세요.

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

돌아가기

복합 작업

이 페이지의 내용