커서에서 데이터 액세스
개요
이 가이드에서는 커서 사용하여 데이터에 액세스하는 방법을 배울 수 있습니다.
커서는 애플리케이션이 주어진 시간에 데이터베이스 결과의 하위 집합만 메모리에 유지하면서 데이터베이스 결과를 반복할 수 있는 메커니즘입니다. 여러 문서와 일치하는 읽기 작업에서는 커서를 사용하여 해당 문서를 배치로 반환합니다.
샘플 커서
각 섹션은 컬렉션의 모든 문서를 포함하는 Cursor
구조체인 다음 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) }
사용 가능한 커서
테일 커서에서 문서 검색을 시도하려면 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())
참고
문서를 개별적으로 조회할 때는 커서를 닫아야 하는데, 이러한 메서드가 커서를 테일이 가능하게 만들기 때문입니다.
추가 정보
이 가이드에서 설명하는 작업에 대해 자세히 알아보려면 다음 가이드를 참조하세요.
API 문서
커서 및 해당 요소에 액세스하는 방법에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.