개요
이 가이드에서는 커서 사용하여 데이터에 액세스하는 방법을 배울 수 있습니다.
커서는 애플리케이션이 주어진 시간에 데이터베이스 결과의 하위 집합만 메모리에 유지하면서 데이터베이스 결과를 반복할 수 있는 메커니즘입니다. 여러 문서와 일치하는 읽기 작업에서는 커서를 사용하여 해당 문서를 배치로 반환합니다.
샘플 커서
Find() 메서드와 같은 읽기 작업은 작업이 일치하는 문서를 참조하는 Cursor을 반환합니다. 커서를 얻으려면 먼저 배포서버에 연결하고 다음 예시에 나와 있는 것처럼 컬렉션에 액세스합니다.
var uri string if uri = os.Getenv("MONGODB_URI"); uri == "" { log.Fatal("You must set your 'MONGODB_URI' environment variable. See\n\t https://www.mongodb.com/ko-kr/docs/drivers/go/current/usage-examples/") } client, err := mongo.Connect(options.Client().ApplyURI(uri)) if err != nil { panic(err) } defer func() { if err := client.Disconnect(context.TODO()); err != nil { panic(err) } }() coll := client.Database("db").Collection("sample_data")
이 가이드의 예시에서는 다음 MyStruct 구조체를 사용하여 컬렉션의 문서를 모델링합니다.
type MyStruct struct { MyProperty string }
다음 코드는 컬렉션에 샘플 문서를 삽입합니다.
docs := []any{ MyStruct{MyProperty: "Beach House"}, MyStruct{MyProperty: "Office"}, MyStruct{MyProperty: "Bungalow"}, } result, err := coll.InsertMany(context.TODO(), docs) if err != nil { panic(err) }
커서를 얻으려면 컬렉션에서 Find() 메서드를 호출하여 쿼리를 실행하고 커서를 반환합니다. 다음 예시에서는 빈 필터를 전달하여 컬렉션의 모든 문서를 일치시키고 결과 커서를 cursor 변수에 할당합니다.
cursor, err := coll.Find(context.TODO(), bson.D{}) if err != nil { panic(err) }
이 가이드의 각 섹션에서는 이 cursor 변수를 사용합니다. 드라이버는 커서가 MyStruct 구조를 참조하는 문서를 언마심링합니다.
중요
커서는 goroutine에 안전하지 않습니다. 동시에 여러 goroutine에서 동일한 커서를 사용하지 마십시오.
문서 개별 조회
현재 고루틴(goroutine)을 차단하면서 커서에서 문서를 개별적으로 조회하려면 Next() 메서드를 사용하세요.
이 메서드는 다음 조건이 모두 충족되는 경우 문서를 반환합니다.
문서가 현재 사용 가능하거나 나중에 사용할 수 있습니다.
드라이버가 오류를 발생시키지 않았습니다.
컨텍스트가 만료되지 않았습니다.
for cursor.Next(context.TODO()) { var result MyStruct if err := cursor.Decode(&result); err != nil { log.Fatal(err) } fmt.Printf("%+v\n", result) } if err := cursor.Err(); err != nil { log.Fatal(err) }
사용 가능한 커서
현재 goroutine 차단하지 않고 문서 조회 하려면 메서드를 사용하세요. 테일 커서 (tailable cursor TryNext() 반복할 때이 방법을 사용합니다.
이 메서드는 다음 조건이 모두 충족되는 경우 문서를 반환합니다.
현재 문서를 사용할 수 있습니다.
드라이버가 오류를 발생시키지 않았습니다.
컨텍스트가 만료되지 않았습니다.
for { if cursor.TryNext(context.TODO()) { var result MyStruct if err := cursor.Decode(&result); err != nil { log.Fatal(err) } fmt.Printf("%+v\n", result) continue } if err := cursor.Err(); err != nil { log.Fatal(err) } if cursor.ID() == 0 { break } }
모든 문서 검색
모든 쿼리 결과로 슬라이스를 채우려면 All() 메서드를 사용하세요.
var results []MyStruct if err := cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { fmt.Printf("%+v\n", result) }
중요
메모리
쿼리 에서 반환되는 문서의 수와 크기가 사용 가능한 애플리케이션 메모리를 초과하면 프로그램이 충돌합니다. 큰 결과 설정하다 예상되는 경우 커서 반복적으로 사용해야 합니다.
커서 닫기
애플리케이션에 더 이상 커서가 필요하지 않은 경우 Close() 방법을 사용하여 커서를 닫습니다. 이 방법을 사용하면 커서가 클라이언트 애플리케이션과 MongoDB 서버 양쪽에서 소비하는 리소스를 해제할 수 있습니다.
defer cursor.Close(context.TODO())
참고
또는 메서드를 사용하여 문서를 개별적으로 조회 Next() TryNext() 경우 항상 커서 닫아 소비하는 리소스를 확보하세요.
추가 정보
이 가이드에서 설명하는 작업에 대해 자세히 알아보려면 다음 가이드를 참조하세요.
API 문서
커서 및 해당 요소에 액세스하는 방법에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.